2011-08-21 29 views
0

我正在研究一個小應用程序,它允許用戶創建一個單詞列表,並且用戶能夠爲該列表提供一個名稱。我設置程序以利用工作單元模式。我希望用戶能夠進行他們想要的所有CRUD更改,然後當用戶準備好更新數據庫時,單擊「保存更改」按鈕執行Context.SaveChanges()並進行所有更改。實體與EntityState.Added不返回在IRepository <T> .FindAll()

我正在使用實體框架和存儲庫&啓用了延遲加載的工作單元模式。列表和單詞類都是POCO映射到數據模型,該數據模型依次映射到數據庫。

我添加代碼:

_unitOfWork.ListRepository.Add(newList); 

的ListRepository.Add方法:

public void Add(T newEntity) 
{ 
    _objectSet.AddObject(newEntity); 
} 

對我後來得到一個InvalidOperationException與消息:序列不包含任何元素。

_unitOfWork.ListRepository.Find(l => l.Name == currentName).Single(); 

我知道爲什麼我得到這個異常,因爲我應該使用SingleOrDefault()來保證安全。但是,我知道我正在尋找的實體存在於上下文中的某處。我的猜測是我沒有在正確的地方尋找。

這裏是擦(或我的知識缺乏):

在調試,我把一個斷點以上_unitOfWork.ListRepository.Add(newList)代碼。一步結束後,我去了即時窗口,做,得到如下:

?_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對象來獲取它。任何援助將不勝感激,請指出正確的方向。

謝謝。

回答

2

這就是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; 
} 
+0

終於有一些時間來回到這個。謝謝你的回答,完美的工作!現在做一些研究來了解發生了什麼。 – blandau

+0

@Ladislav:尊重!這些EF問題無處不在。驚人的你知道多少! – Learner