![](/img/trans.png)
[英]Entity framework fails to save if multiple records under same list has `EntityState.Added`
[英]Entity With EntityState.Added Not Returned In IRepository<T>.FindAll()
我正在開發一個小應用程序,它允許用戶創建單詞列表,用戶可以為列表提供名稱。 我設置程序以利用工作單元模式。 我希望用戶能夠進行他們想要的所有CRUD更改,然后當用戶准備好更新數據庫時,單擊“保存更改”按鈕以執行Context.SaveChanges()並進行所有更改。
我正在使用實體框架與存儲庫和工作單元模式啟用了延遲加載。 列表和單詞類都是映射到數據模型的POCO,而數據模型又是從數據庫映射的。
我的添加代碼:
_unitOfWork.ListRepository.Add(newList);
ListRepository.Add方法:
public void Add(T newEntity)
{
_objectSet.AddObject(newEntity);
}
稍后我得到一個帶有消息的InvalidOperationException:Sequence不包含任何元素。
_unitOfWork.ListRepository.Find(l => l.Name == currentName).Single();
我知道為什么我會得到那個例外,因為我應該使用SingleOrDefault()來保證安全。 但是,我知道我正在尋找的實體存在於上下文中的某些位置。 我的猜測是我沒有在正確的地方搜索。
這是摩擦(或我缺乏知識):
在調試期間,我在上面的_unitOfWork.ListRepository.Add(newList)代碼上放了一個斷點。 在一個Step-Over之后,我去了立即窗口,並做了以下事情:
?_unitOfWork.ListRepository.FindAll().Count();
1
“1”應該是“2”
ListRepository.FindAll()方法:
public IQueryable<T> FindAll()
{
return _objectSet;
}
我已經跟蹤了我的代碼,我只是初始化了我的_unitOfWork對象一次。 我在存儲庫中公開了ObjectSet.Context.ObjectStateManager,當調試中出現異常助手時,我可以轉到立即窗口並執行:
_unitOfWork.ListRepository.GetObjectStateManager()
.GetObjectStateEntries(EntityState.Added).Count();
1
所以,我知道實體在那里,但我不知道如何使用_unitOfWork或ListRepository對象來實現它。 任何幫助將不勝感激,或請指出我正確的方向。
謝謝。
這就是EF的行為方式。 您的Find
和FindAll
訪問ObjectSet
實例。 這將始終對數據庫進行查詢 - 它對創建的實體沒有任何作用,但尚未插入到數據庫中,並且它們不能作為返回結果的一部分。
要獲取尚未持久化的實體,必須在ObjectStateManager
搜索。 您可以將其添加到存儲庫以允許搜索單個實體。 它將首先搜索內部EF存儲,如果找不到實體,它將搜索數據庫:
private T SearchStateManager(Expression<Func<T, bool>> searchCriteria)
{
return _context.ObjectStateManager.GetObjectStateEntries(~EntityState.Detached)
.Where(e => !e.IsRelationship)
.Select(e => e.Entity)
.OfType<T>()
.SingleOrDefault(searchCriteria.Compile());
}
public T Single(Expression<Func<T, bool>> searchCriteria)
{
T entity = SearchStateManager(searchCriteria);
if (entity == null)
{
entity = _objectSet.SingleOrDefault(searchCriteria);
}
return entity;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.