コントローラのこのメソッドに投稿されたNewUserViewModelにバインドされたビューがあります。
[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(user);に到達したとき 上記の方法では、このエラーが発生します
エンティティオブジェクトは、IEntityChangeTrackerの複数のインスタンスから参照することはできません。
UserRepositoryのコンストラクターでUnitOfWorkオブジェクトを使用してContextを渡すことで、これらのエラーを回避できると思いました。
私は何が間違っているのですか?