工作,我有一個綁定到其發佈到控制器的這種方法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對象的上下文我想避免這些錯誤。
我在做什麼錯?
你應該看看使用依賴注入容器如Ninject或AutoFac。它使管理您的存儲庫/上下文變得更容易,因爲您從不自己構建它們。 – Dismissile
與你的問題沒有關係,但是你應該小心'UnitOfWorkUser'處理這個上下文,而不是創建它。不應該處理你不擁有的物體。 – bhamlin