Asp.net MVC 4 および EF 5.0 の使用
問題:
ドロップダウンリストでユーザーを選択し、投稿をアクションに送信するたびに。次の 2 つのことが起こります。
次のように、ユーザーが DinnerEvent に追加されます。
選択したユーザーが複製されたため、データベースのユーザー テーブルにユーザーの 2 つのインスタンスが作成されました。これは悪いことです。:(
セットアップはこちら
私は、DinnerEvent と User の 2 つのエンティティを作成しました。
DinnerEvent クラスには、アテンダント (ユーザー) のコレクションへのナビゲーション プロパティがあります。
public virtual ICollection<User> Attendants { get; set; }
DinnerEvent と Users の両方のリポジトリを作成しました
DinnerEventコントローラーのAddAttendantToEvent アクション
[HttpPost]
public ActionResult AddAttendantToEvent(int users , int EventID )
{
if (ModelState.IsValid)
{
var user = userRepository.Find(users);
dinnereventRepository.Find(EventID).Attendants.Add(user); //Add the User to the Event.
dinnereventRepository.Save();
return RedirectToAction("Index");
}
else
{
return View();
}
}
ビュー- すべてのイベントを反復処理し、すべてのユーザーが入力されたドロップダウン リストを各イベントに追加します。
@model Madklub.Models.ViewModel
@foreach (var item in Model.events) {
//Code to display available events
@using (Html.BeginForm("AddAttendantToEvent", "DinnerEvents")) {
@Html.Hidden("EventID", item.DinnerEventID);
@Html.DropDownListFor(m => m.users, new SelectList(Model.users, "UserID", "RoomNumber"));
<input type="submit" value="Add" />
}
ViewModel:
public class ViewModel
{
public IQueryable<DinnerEvent> events { get; set; }
public IQueryable<User> users { get; set; }
}
which is initialized like this:
Index Action in DinnerEventController:
public ViewResult Index()
{
ViewModel viewdata = new ViewModel();
viewdata.events = dinnereventRepository.AllIncluding(m => m.Attendants);
viewdata.users = userRepository.All;
return View(viewdata);
}
What am I doing wrong?
要求されたリポジトリ コード:
Save() メソッドのみを含むように縮小されました。
これはすべて Scaffolding によって自動生成されたコードであることに注意してください。
public class DinnerEventRepository : IDinnerEventRepository
{
MadklubContext context = new MadklubContext();
public void Save()
{
context.SaveChanges();
}
}
public class MadklubContext : DbContext
{
public DbSet<Madklub.Models.User> Users { get; set; }
public DbSet<Madklub.Models.MadklubEvent> MadklubEvents { get; set; }
}