1

コントローラのこのメソッドに投稿された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を渡すことで、これらのエラーを回避できると思いました。

私は何が間違っているのですか?

4

2 に答える 2

0

asp.net mvc で UOW を使用するためのより良いアプローチがあります。コンテキスト内でエンティティの寿命の多くの側面を考慮しないので、この記事を読むことをお勧めします。

于 2012-12-04T19:33:50.467 に答える
0

これは私には非常に間違っているように見えます。ユニットワークパターンの目的は、すべての「作業」を 1 つのオブジェクトに統合することです。次のコードにはいくつかの問題があります。

  1. DBContext を 2 回破棄しているようです

  2. 必要なのは dbcontext だけなので、UOW オブジェクトの代わりに dbcontext だけをリポジトリに渡す必要はありません

  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/

于 2012-12-05T01:38:01.013 に答える