我使用Database First和DbContext從Linq-to-SQL遷移到實體框架(4.4)。我想知道以下行爲是否正常:當我更改關聯時,是否必須手動設置外鍵屬性?
using (var e = new AgendaEntities()) {
var store = e.Stores.First();
var office = e.Offices.Create();
office.Store = store; // Set association
Console.WriteLine(office.StoreID); // shows Guid.Empty, expected store.ID!
}
在L2S中,Store
關聯設置一個實體也將更新StoreID
關鍵。在EF中,這似乎沒有發生。這與實體是新的還是從上下文加載無關。
當我SaveChanges
,它保存正確,StoreID
更新爲匹配office.ID
,但爲什麼這隻發生在保存後?
有什麼我失蹤了,或者我現在應該保持外鍵手動同步嗎?
解決方案編輯: 這就是所謂的屬性修正,並用於由生成的代理自動完成。但是,與DbContext
這不再是這種情況。根據this Connect issue,這是設計。
你好, 的模板的DbContext實際上並不產生將被用作變化跟蹤代理類 - 只是懶加載代理(不這樣做修復時)。我們做出這個決定是因爲更改跟蹤代理非常複雜,並且有很多細微差別,可能會讓開發人員感到困惑。 如果您想要在SaveChanges之前進行修復,您可以調用myContext.ChangeTracker.DetectChanges。 〜EF團隊
另一種方法是調用DbContext.Entry(entity)
,它將同步實體。本文中介紹了這一點:Relationships and Navigation Properties在「同步FK和導航屬性之間的更改」下。
很難理解沒有更多的人欣賞這種解決方案。沒有人用這種方式使用dbcontext? – danihp 2013-07-10 08:38:12
就我個人而言,我現在只需在每次更改關聯時手動設置密鑰。修復是一件很好的事情,但經過一番思考,預計POCO無論如何都沒有多大意義。任何改變關聯的操作無論如何都應該在某個領域層方法中抽象出來,所以最終它不會像我想的那樣令人不安。 – 2013-07-10 09:26:31
我是通過dbEntityValidations與所有業務規則「盲」的實體能夠將實體展示給UI層,至少對於「簡單」實體。我使用'entry.related'來處理lazyloading相關實體,但使用detectChanges方法。感謝您的帖子和解決方案。 – danihp 2013-07-10 09:52:06