4

エンティティ フレームワークを使用してドメイン エンティティを保持したいと考えています。私のプロジェクトは次のように設定されています:-

  • UI: MVC (Automapper を使用してドメイン エンティティとビュー モデルをマッピング)
  • ドメイン: エンティティ、サービス、リポジトリ インターフェイス
  • リポジトリ: Entity Framework (ドメイン層からのインターフェイスを実装)。Automapper を使用して、ドメイン エンティティとエンティティ フレームワーク オブジェクトをマッピングします。

これはうまく機能しますが、私のサービスでは、リポジトリをチェックしてから更新を実行してアイテムを検証するようなことをする場合を除きます。Entity Frameworks ID マップが以前に項目を認識したため、これは失敗し、再度アタッチしようとしました。

次のコードを使用して、この問題を回避できます (これはより一般的なものになります)。

        public void Update(Domain.Entities.Book entity)
    {
        Book newBook = _mapper.Map<Domain.Entities.Book, Book>(entity);
        ObjectStateEntry cacheEntry;
        if (_dataContext.ObjectStateManager.TryGetObjectStateEntry(_dataContext.CreateEntityKey("Books",newBook), out cacheEntry))
        {
            _dataContext.Books.ApplyCurrentValues(newBook);
        }
        else
        {
            _dataContext.Books.Attach(newBook);
            _dataContext.ObjectStateManager.ChangeObjectState(newBook, EntityState.Modified);
        }
        _dataContext.SaveChanges();
    }

問題は、自分が削除のために同じ種類のコードを書かなければならないことです

        public void Delete(Domain.Entities.Book entity)
    {
        Book newBook = _mapper.Map<Domain.Entities.Book, Book>(entity);
        ObjectStateEntry cacheEntry;
        if (_dataContext.ObjectStateManager.TryGetObjectStateEntry(_dataContext.CreateEntityKey("Books", newBook), out cacheEntry))
        {
            _dataContext.ObjectStateManager.ChangeObjectState(cacheEntry.Entity, EntityState.Deleted);

        }
        else
        {
            _dataContext.Books.Attach(newBook);
            _dataContext.ObjectStateManager.ChangeObjectState(newBook, EntityState.Deleted);
        }
        _dataContext.SaveChanges();
    }

私がやろうとしていることを達成するためのより良い方法があるに違いないと確信していますが、私の人生では何を理解することはできません!

上記のアプローチに関するその他の一般的なコメントは、大規模なプロジェクトで使用しようとしているため、高く評価されます。

ありがとう

ロス

4

2 に答える 2

1

Trailmax が言ったように、複数のデータ コンテキストがあるようです。私は 1 つのデータ コンテキストを撮影します。これは、汎用リポジトリを作成することで実行できます。エンティティとリポジトリの間に 1 対 1 の関係があると仮定すると、次の記事が目標の達成に役立つ場合があります: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing -the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application .

于 2012-08-24T18:20:24.410 に答える
0

あなたの質問を完全に読み違えていない限り、問題は DatabaseContext オブジェクトの複数のインスタンスにあると思います。1 つのコンテキスト インスタンスからオブジェクトを取得し、それをコンテキストの別のインスタンスで操作しようとすると、多くの例外が発生します。 、異なるコンテキスト インスタンスに関連付けられているためです。

アタッチされたオブジェクトを管理するコンテキスト インスタンスが 1 つしかない場合は、オブジェクトが既にアタッチされていることがわかり、それを操作します。また、AutoMapper を使用してオブジェクトを複製する必要はありません (メンバー単位の複製には良いテクニックです!)。

Dependency Injection を発見するまで、複数のコンテキスト インスタンスで同様の問題がたくさんありました。これは魔法です。DBContext のインスタンスを 1 つ作成し、すべてのリクエストと EF 管理に使用します。

于 2012-08-24T11:25:30.217 に答える