2012-04-11 98 views
9

我在我的代碼中需要加載所有相關實體(都是 - > 1 FK和 - > N FK)的特定查詢,因爲上下文將在。EF代碼優先:包括不工作的可選關係

我做了一個通用的「查詢」方法,需要params Expression<Func<MyItem, object>>[] includes,然後在內部鏈接它們。這部分工作正常。

查詢看起來像這樣:

var item = facade.Query<MyItem>(
       c => c.Childs.Select(x => x.Parent), 
       c => c.Childs.Select(x => x.SubChild1), 
       c => c.Childs.Select(x => x.SubChildNotWorking), 
       c => c.Childs.Select(x => x.SubChild2), 
       c => c.Childs.Select(x => x.SubChild3), 
       c => c.Childs.Select(x => x.SubChildrens) 
       ).FirstOrDefault(c => c.Name == name); 

爲不工作屬性(放置在SubChildNotWorking的配置)的映射:

this.HasMany(scnw => scnw.Childs).WithOptional(c => c.SubChildNotWorking).HasForeignKey(c => c.MyForeignKey); 

在所有的包括,僅SubChildNotWorking沒有按」實際上工作。當用調試器檢查返回的對象時,我會看到所有屬性上的代理。打開代理爲我提供了所有其他關係的正確數據,併爲SubChildNotWorking屬性提供了「對象上下文已處理異常」。

我能夠發現的唯一區別是SubChildNotWorking是一個可爲空的FK(在DB上有可空列和在dbcontext中有可選配置),而所有其他的都是使用WithRequired配置的不可空FK。

該數據庫也是一個遺留的數據庫,不是用Code First創建的,也沒有遵循它的約定,我只是在DbContext中做了映射。其他一切正常。

我想弄清楚,如果急於加載不能在可空的FK上工作,但我找不到任何有關該文件的文檔。

這是一個錯誤,還是打算的行爲?但最重要的是,我該如何解決這個問題?

謝謝。

+0

如果你只包括沒有其他subchildren了'SubChildNotWorking'會發生什麼?那它有用嗎? – Slauma 2012-04-11 11:38:18

+0

不是。也不起作用。 – 2012-04-11 11:53:20

+1

您可以檢查SQL查看是否正確(使用'var sql = facade.Query (c => c.Childs.Select(x => x.SubChildNotWorking))。ToString();')並手動測試查詢SSMS是否返回預期的結果行。 – Slauma 2012-04-11 12:05:24

回答

0

你有沒有在你的類(實體)定義

[DataContract] 

?如果是的話,不要忘記用

[DataMember] 

來註釋SubChild或者它可能最終會加載,但沒有顯示出來,當你進行實體上的GET調用。

0

當您使用include方法時,您正在討論熱切加載模式。具有關係的實體將作爲集合加載。對於任何不可空的外鍵,都有一個簡單的集合開始爲空,但對於可爲空的集合,沒有。在代碼中,您可以使導航屬性變爲虛擬,但這不是您的情況。您可以嘗試直接加載上下文,例如:

var someEntity = context.someEntities.Find(1); 
context.Entry(someEntity).Reference(e => e.EntityWithFKNullable).Load(); 

或較短的版本:

context.EntitiesWithFKNullable.Load();