2010-01-22 67 views
4

我是實體框架和LINQ的新手,已經遇到了一個相當奇怪的場景。實體框架:數據庫更新後,LINQ Include()不起作用,爲什麼?

我一直在使用下面的查詢返回的帳戶信息:

var account = ((from acct in _entities.Account 
         join m in _entities.Item on acct.Id equals m.Account.Id 
         where acct.Id == accountId && m.ItemNumber.EndsWith(itemNumber) 
         select acct) as ObjectQuery<Account>).Include("Item.ItemDetails"); 

我們最近做了一些改動到數據庫,並生成一個新的EDMX文件。更改後,上述查詢仍然返回該帳戶和關聯的項目,但ItemDetails不再包含在內。

我已驗證查詢返回的SQL,並且在返回正確的數據時似乎沒有任何問題。

此外,我沒有看到在Item和ItemDetails對象之間的edmx文件中有不同的anthing,因爲它們沒有改變,導航屬性也在那裏。

有沒有人見過這個?

感謝

回答

1

在include(...)使用導航屬性的名稱,所以這將是很好的從的.edmx(尤其是如果它是單數還是複數)檢查屬性的準確名稱。

你也可以嘗試改變這樣的查詢:

var account = from acct in _entities.Account.Include("Item.ItemDetails") 
       join m in _entities.Item 
        on acct.Id equals m.Account.Id 
       where acct.Id == accountId && m.ItemNumber.EndsWith(itemNumber) 
       select acct; 
+0

除了可讀性,並查詢有超過海報的什麼優勢? – mlsteeves 2010-01-25 20:31:23

+0

我認爲這種方式有相同的結果: 從_entities.Account.Include( 「項目」),ACCT包括( 「Item.ItemDetails」) 其中acct.Id ==帳戶ID && m.ItemNumber.EndsWith(itemNumber。 ) 選擇acct; – 2010-01-28 17:10:12

+0

我想測試這個....記住有一個奇怪的行爲與包括和加入:) – SDReyes 2010-02-23 13:23:17

1

你有兩種可能的情形之一:

  1. ItemAccount的關係(在你的實體模型的表達一個EntityAssociation和在DB中作爲外鍵):

  2. Item設置一個d Account集合,因此,您必須像您所做的那樣在LINQ中指定加入。

案例1:如果是這樣的話,那麼你就不需要通過選擇Acount.Item自然就會給你的所有項目,其中Item.AccountID等於Account.ID

所以你的加入...聲明加入聲明:join m in _entities.Item on acct.Id equals m.Account.Id 已經基本告訴Item回到Account檢查ID。如果他們尚未連接,那麼你就不可能得到m.Account.ID

案例2:如果有AccountItem之間沒有任何關係,那麼.Include()肯定是不行的,因爲導航屬性不會在你的模型存在。

結論:檢查您的新模型,看看AccountItem之間是否存在關係。如果是,則刪除加入。如果沒有關係,那麼你做錯了什麼。

這裏是一個select語句假設情景1和Account.Item不是一個集合:

var account = from acct in _entities.Account.Include("Item.ItemDetails") 
       where acct.Id == accountId && acct.Item.ItemNumber.EndsWith(itemNumber) 
       select acct; 
相關問題