2017-02-15 15 views
0

私はmvc 5を使って学校にオンライン予約システムを作っています。 スタッフは今後予定されているトレーニングプログラム(スケジュールと呼ばれています)を自分自身で予約することができます。スキャフォールディング方法を使用してページを作成しましたが、すでに予約を行っているユーザーが同じスケジュールに再度自分自身を予約することはできないという問題があります。MVC 5のC#で重複予約を停止する方法?

EG:

  • scheduleID:12
  • StaffID:1
  • 日:12/1/17
  • のSessionID:あなたがStaffIdを見るように3

既に存在して同じStaffIDが同じスケジュールIDのために再度予約できないようにスケジュール表12

以下の私のコード:

public ActionResult BookingCreate() 
{ 
    ViewBag.ScheduleID = new SelectList(db.Schedules, "ScheduleID", "ScheduleID"); 
    ViewBag.SessionID = new SelectList(db.TblSessions, "SessionId", "Name"); 
    ViewBag.StaffID = new SelectList(db.Staffs, "StaffID", "Firstname"); 

    return View(); 
} 

// POST: Booking/BookingCreate 
// To protect from overposting attacks, please enable the specific properties you want to bind to, for more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult BookingCreate([Bind(Include = "BookingID,StaffID,SessionID,ScheduleID,Schedule,TblSession,Staff")] Booking booking) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Bookings.Add(booking); 
     db.SaveChanges(); 
     DisplaySuccessMessage("Has append a Booking record"); 
     return RedirectToAction("BookingIndex"); 
    } 


    ViewBag.ScheduleID = new SelectList(db.Schedules, "ScheduleID", "ScheduleID", booking.ScheduleID); 
    ViewBag.SessionID = new SelectList(db.TblSessions, "SessionId", "Name", booking.SessionID); 
    ViewBag.StaffID = new SelectList(db.Staffs, "StaffID", "Firstname", booking.StaffID); 
    DisplayErrorMessage(); 
    return View(booking); 
} 
+0

説明は非常に曖昧です。より良い例を明確に説明してください。 – Steve

答えて

1

あなたは、予約テーブルにUnique constraintを作成することができます。次のようなものがあります。

ALTER TABLE Bookings 
ADD CONSTRAINT UC_Bookings UNIQUE (ScheduleID, StaffID); 

この制約は、ビジネスルールを永続レイヤーに課すことになります。したがって、このルールに違反するデータを投稿すると例外がスローされ、必要に応じて処理できます。

この方法を使用すると、常にDBに入り、受け入れるか、予約を拒否します。

もう1つのアプローチは、あなたが再スケジュールされたscheduleIDに対してスケジュールされたstaffIDがあるかどうかをチェックすることです(モデルが有効である場合)。このアプローチの

if(!db.Bookings.Any(b=>b.ScheduleID == booking.ScheduleID 
        && b.ScheduleID == booking.ScheduleID)) 
{ 
    db.Bookings.Add(booking); 
    db.SaveChanges(); 
    DisplaySuccessMessage("Has append a Booking record"); 
    return RedirectToAction("BookingIndex"); 
} 

(明らか)のみ欠点はあなたがそれぞれの有効な予約(私はstaffIDと以前に使用されていないscheduleIDを意味する)のために、二回データベースを襲っているという事実です。

それが働いた

が、そのは私にエラーページを与える「ことはできません ブック再び」のようなものを言って、私は任意のダイアログボックスまたはテキストにそれらを を変更することができますどのような方法がありますか?

try..catchを試してみることもできます。

try 
{ 
    db.Bookings.Add(booking); 
    db.SaveChanges(); 
    DisplaySuccessMessage("Has append a Booking record"); 
    return RedirectToAction("BookingIndex") 
} 
catch(Exception ex) 
{ 
    // Handle here the exception and return to the use a friendly message. 
} 
+0

ありがとう、それは働いたが、それは私にエラーページを与える私は、ダイアログボックスやテキストを "あなたは再び予約できない"のような何かに変更することができる方法はありますか? – kamiston

+0

あなたは大歓迎です!私の更新を見てください。ありがとう – Christos

関連する問題