實體框架:重新查找最近添加到上下文的對象

entity-framework

我正在使用實體框架,我遇到了“重新找到”我剛剛創建的對象的問題...基本上它是這樣的:

string theId = "someId";

private void Test()
{
  using(MyEntities entities = new MyEntities())
  {
    EntityObject o = new EntityObject();
    o.Id = theId;
    entities.AddToEntityObject(o);
    CallSomeOtherMethod(entities);
  }
}

void CallSomeOtherMethod(MyEntities ents)
{
  EntityObject search = ents.EntityObject.FirstOrDefault(o => o.Id == theId);
  if(search == null) 
  {
    Console.WriteLine("wha happened???");
  }
}

(不保證代碼可以正常運行 - 這一切都來自我的腦海)

為什麼查詢“找不到”剛剛創建的EntityObject?

如果我在AddToEntityObject之後調用SaveChanges()它可以工作(這並不讓我感到驚訝),但為什麼它不能正確地從緩存中拉出來?

我對這些東西仍然很綠,所以我希望有一些非常簡單的東西,我只是忽略了......

謝謝

一般承認的答案

發生這種情況是因為ents.EntityObject.WhatEver始終查詢數據源。這是一個設計決定。他們這樣做,因為否則他們必須針對數據源執行查詢,針對本地緩存,然後合併結果。正如其中一位開發人員在博客中指出的那樣(不記得究竟在哪裡)他們無法始終如一地處理這個問題。

你可以想像,你需要妥善處理邊緣情況。您可以找到您在本地創建的ID,由數據庫中的其他人創建。這將迫使您準備好處理(幾乎)每個查詢的衝突。也許他們可以創建查詢本地緩存的方法和查詢數據源的方法,但這也不是聰明的。

您可以查看透明延遲加載實體框架 。這將取代普通的代碼生成器,您將獲得在訪問時自動填充其相關實體集合和實體引用的實體。這避免了所有

if (!Entity.ReleatedEntities.IsLoaded)
{
   Entity.RelatedEntities.Load();
}

代碼片段。您可以查詢集合,因為它們始終是隱式加載的。但這個解決方案也不完美。有一些問題。例如,如果您創建新實體並訪問相關實體的集合,則會出現異常,因為代碼無法從數據庫中檢索相關實體。還有一個與數據綁定有關的問題,可能還有一些我不知道的問題。

好的是你得到了源代碼,並且能夠自己修復問題,如果我找到一些時間,我將檢查第一個問題。但我很確定它不會那麼容易修復,因為我預計如果剛剛創建的實體不是預期的行為,有些情況就是沒有命中數據庫。


熱門答案

新添加的對像在本地數據源中,因為它沒有在數據庫中EntityObject search = ents.EntityObject.FirstOrDefault(o => o.Id == theId) ?? ents.EntityObject.Local.FirstOrDefault(o => o.Id == theId);所以你可以說EntityObject search = ents.EntityObject.FirstOrDefault(o => o.Id == theId) ?? ents.EntityObject.Local.FirstOrDefault(o => o.Id == theId);



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因