2013-10-04 40 views
1

首先:我對asp.net mvc和代碼第一次很新。ASP.net MVC EF Codefirst重複條目

使用Asp.net MVC 4和EF 5.0

問題:

每當我選擇在下拉列表用戶,並提交後的行動。 發生了兩件事:

  1. 用戶添加到DinnerEvent爲應該:

  2. 這是選擇被複制,所以,我現在擁有的用戶的兩個實例在用戶表中的用戶在數據庫中。哪個不好。 :(




這裏是設置

我已經創建了兩個實體: DinnerEvent和用戶

的DinnerEvent類有一個導航屬性到服務員(用戶)收集

public virtual ICollection<User> Attendants { get; set; } 

我在DinnerEvent控制器中創建兩個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(); 
    } 
} 

視圖 - 在所有的事件迭代,並添加一個用所有用戶foreach事件填充的下拉列表。

@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()方法。

請注意,這是由腳手架自動生成的所有代碼。

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; } 

} 
+0

你能張貼代碼你的倉庫? –

+0

我已經添加了存儲庫代碼,注意:這是所有自動生成的代碼。 –

+0

@KristianGrønborgNissen,重複的原因是,您正在向Event添加一個分離的實體(因此EF不知道它存在),因此當您保存更改時,它會添加它。 – Johan

回答

2

單位工作模式:(順便說一句,讓你的回購的/ UOW IDisposable的,所以你可以清理的DbContext實例)

public class DinnerEventRepository : IDinnerEventRepository 
{ 
    MadklubContext _context = new MadklubContext(); 

    public void Save() 
    { 
     _context.SaveChanges(); 
    } 

    public DinnerEventRepository(MadklubContext context = null) 
    { 
     _context = context ?? new MadklubContext(); 
    }  
} 

public class UserRepository //: IUserRepository 
{ 
    MadklubContext _context = new MadklubContext(); 

    public void Save() 
    { 
     _context.SaveChanges(); 
    } 

    public UserRepository(MadklubContext context = null) 
    { 
     _context = context ?? new MadklubContext(); 
    }  
} 

public class RsvpUnitOfWork // come up with a better name 
{ 
    MadklubContext _context = new MadklubContext(); 

    public DinnerEventRepository DinnerEventRepo { get; private set; } 
    public UserRepository UserRepo { get; private set; } 

    public RsvpUnitOfWork() 
    { 
     DinnerEventRepo = new DinnerEventRepository(_context); 
     UserRepo = new UserRepository(_context); 
    } 

    public void Save() 
    { 
     _context.SaveChanges(); 
    } 
} 

用法:

[HttpPost] 
public ActionResult AddAttendantToEvent(int users , int EventID) 
{ 
    if (ModelState.IsValid) 
    { 
     // this should be a using statement once you implement IDisposable 
     // e.g. using(var uow = new RsvpUnitOfWork()) { ... } 
     var uow = new RsvpUnitOfWork(); 
     // you need to validate that user != null 
     var user = uow.UserRepo.Find(users); 
     // possible null reference exception if dinner event not found for EventID 
     uow.DinnerEventRepo.Find(EventID).Attendants.Add(user); //Add the User to the Event. 
     uow.Save(); 
     return RedirectToAction("Index"); 
    } 
    else 
    { 
     return View(); 
    } 
} 
+0

解決了這個問題。非常感謝。所以問題是,存儲庫沒有使用DbContext的相同實例?! –

+1

是的 - 您正在將'UserRepository'上下文中的User對象引入'DinnerEventRepository'的上下文中,這使得它看起來是新的,因此是一個添加/插入操作。 – Moho