2015-07-09 34 views
1

這工作:奇怪的行爲在實體INCLUDE框架

using (var dbContext = new SmartDataContext()) 
{ 
    dbContext.Configuration.ProxyCreationEnabled = false; 

    var query = dbContext.EntityMasters.OfType<Person>(); 
    if (includeAddress) 
     query.Include(p => p.Addresses); 
    if (includeFiles) 
     query.Include(p => p.FileMasters); 

    output.Entity = query.Include(s=>s.Addresses).FirstOrDefault<Person>(e => e.EntityId == id); 
} 

雖然這並不:

using (var dbContext = new SmartDataContext()) 
{ 
    dbContext.Configuration.ProxyCreationEnabled = false; 

    var query = dbContext.EntityMasters.OfType<Person>(); 
    if (includeAddress) 
     query.Include(p => p.Addresses); 
    if (includeFiles) 
     query.Include(p => p.FileMasters); 

    output.Entity = query.FirstOrDefault<Person>(e => e.EntityId == id); 
} 

我想包括地址,文件基於布爾標誌從功能到來。但是,似乎EF在使用IF條件時不包括它們。

這與我的previous問題有關,它使用Include實際工作。

+0

**經驗法則:**如果非要說「編輯」把在編輯,那麼你並不真正需要編輯。 –

回答

2

您需要的Include結果分配回query

query = query.Include(p => p.Addresses); 
0

實體框架的'Include'函數只有在連接到查找實體的整個linq查詢時纔可用。這是因爲linq查詢實際上是一種Expression的形式,可以在執行之前作爲一個整體進行檢查。

在第二個例子中,Person對象已經從數據庫中分離出來,因此EF沒有關於哪個表Person來自哪個表以及如何將Person與地址表連接起來以獲得所需結果的信息。

如果啓用動態代理生成功能,EF能夠跟蹤實體和數據庫之間的關係。但是,我不確定這是否會使包含聲明起作用。

+0

我不相信你的發言。當你說Person對象已經從數據庫中分離出來時,你是什麼意思?它是一個IQueryable對象,'query'變量持有正在修改的查詢。 –