エンティティ フレームワークを使用してドメイン エンティティを保持したいと考えています。私のプロジェクトは次のように設定されています:-
- 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();
}
私がやろうとしていることを達成するためのより良い方法があるに違いないと確信していますが、私の人生では何を理解することはできません!
上記のアプローチに関するその他の一般的なコメントは、大規模なプロジェクトで使用しようとしているため、高く評価されます。
ありがとう
ロス