1

工作,我有一個綁定到其發佈到控制器的這種方法NewUserViewModel視圖。麻煩工作單元和存儲庫模式在MVC應用程序

[HttpPost] 
    public ActionResult NewUser(NewUserViewModel newUser) 
    { 
     var user = new User(); 
     user.Id = newUser.Id; 
     user.Email = newUser.Email; 
     //more mapping hidden for brevity 

     //here is where the trouble starts 
     _userService.AddNewUser(user); 

     return RedirectToAction("Users"); 
    } 

的_userService是在在控制器構造函數實例這樣

private IUserService _userService; 

    public ControllerName() 
    { 
     _userService = new UserService(); 
    } 

在_userService的AddNewUser函數方法看起來像這樣的私人領域。

 public void AddNewUser(User newUser) 
     { 
     using (var uow = new UnitOfWorkUser(new Context())) 
     { 
      using (var _userRepo = new UserRepository(uow)) 
      { 
       _userRepo.InsertOrUpdate(newUser); 
       uow.Save(); 
      } 
     } 
    } 

UserRepository的構造函數看起來像這樣。

private Context _context; 

    public UserRepository(UnitOfWorkUser unitOfWork) 
    { 
     _context = unitOfWork.Context; 
    } 

像這樣的unitOfWorkLooks。

public class UnitOfWorkUser :IDisposable, IUnitOfWork 
{ 
    private readonly Context _context; 

    public UnitOfWorkUser(Context context = null) 
    { 
     _context = context ?? new Context(); 
    } 

    public int Save() 
    { 
     return _context.SaveChanges(); 
    } 

    internal Context Context 
    { 
     get { return _context; } 
    } 

    public void Dispose() 
    { 
     _context.Dispose(); 
    } 
} 

而_userRepo上的InsertOrUpdate方法看起來像這樣。

public virtual void InsertOrUpdate(User user) 
    { 
     if (user.Id == default(int)) 
     { 
      _context.Users.Add(user); 
     } 
     else 
     { 
      _context.Entry(user).State = System.Data.EntityState.Modified; 
     } 
    } 

當我到了 _context.Users.Add(用戶); 在上面的方法中我得到這個錯誤

一個實體對象不能被多個IEntityChangeTracker實例引用。

我想通過在UserRepository的構造函數中傳遞與UnitOfWork對象的上下文我想避免這些錯誤。

我在做什麼錯?

+0

你應該看看使用依賴注入容器如Ninject或AutoFac。它使管理您的存儲庫/上下文變得更容易,因爲您從不自己構建它們。 – Dismissile

+0

與你的問題沒有關係,但是你應該小心'UnitOfWorkUser'處理這個上下文,而不是創建它。不應該處理你不擁有的物體。 – bhamlin

回答

0

有一個更好的方法在asp.net mvc的使用UOW,你不考慮實體續航時間很多方面的背景,所以我建議閱讀this article

0

這看起來非常錯誤的我。單位工作模式的目的是將你所有的「工作」整合到一個對象中。有幾個問題,用下面的代碼:

  1. 看起來你要丟棄的的DbContext兩次

  2. 既然你只需要的DbContext,你不應該只的DbContext傳遞到存儲庫,而不是UOW對象

  3. 您可能想要對UserRepository進行內部引用。它應該用來分組您的存儲庫,並確保它們都共享相同的EF上下文實例。樣本看起來像UnitOfWorkUser.UserRepo.Save(NEWUSER)

    using (var uow = new UnitOfWorkUser(new Context())) 
        { 
         using (var _userRepo = new UserRepository(uow)) 
         { 
          _userRepo.InsertOrUpdate(newUser); 
          uow.Save(); 
         } 
        } 
    

這裏是你如何使用UOW一個例子,

http://www.mattdurrant.com/ef-code-first-with-the-repository-and-unit-of-work-patterns/

相關問題