簡體   English   中英

在IRepository中未返回EntityState.Added的實體 <T> 。找到所有()

[英]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的行為方式。 您的FindFindAll訪問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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM