我想使用實體框架來保存域實體。我的項目的設置如下: -實體框架和存儲庫模式
- UI:MVC(使用Automapper域實體和視圖模型之間的映射)
- 域名:entites的,服務,存儲庫接口
- 庫:實體框架(實施來自域層的接口)。使用Automapper在域實體和實體框架對象之間進行映射。
這很好,除非在我的服務中,如果我通過檢查存儲庫來驗證項目,然後執行更新。這失敗了,因爲實體框架標識映射已經看過該項目,我嘗試重新附加它。
我可以使用代碼如下(這將是更加通用)
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();
}
我自己解決此問題
我確定必須有更好的方式來實現我想要做的事情,但是我不能爲我的生活找出什麼!
有關上述方法的任何其他一般性評論將被讚賞,因爲我即將在大型項目中使用它!
感謝
羅斯
我想知道如何進入一個你不知道一個實體是否已經連接的情況。在像更新實體這樣的基本用例中使用像TryGetObjectStateEntry這樣的高級方法在我看來是代碼味道。另外請注意,您的更新依賴於'cacheEntry.Entity'代表數據庫中的原始狀態,否則「ApplyCurrentValues」和更改跟蹤將不會標記正確的屬性被修改爲執行正確的數據庫更新。你是否知道,當你甚至不知道這個實體是否已經連接? – Slauma 2012-08-15 17:13:46
創建資源庫對象並獲取項目會導致項目被加載到EF中,然後轉換爲域項目。然後可以編輯該域項目,然後過去到存儲庫更新方法。然後這個域對象(使用AutoMap)變成一個分離的EF對象。由於密鑰已被保存,因此將其附加到EF將導致異常。我很驚訝這對人們來說不是一個更大的問題? – 2012-08-15 17:17:53
我明白了。但是,爲什麼區分「域實體」和「EF實體」?沒有中間映射,ORM是否能夠堅持域實體? – Slauma 2012-08-15 17:44:14