2013-03-21 53 views
9

我使用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和導航屬性之間的更改」下。

+0

很難理解沒有更多的人欣賞這種解決方案。沒有人用這種方式使用dbcontext? – danihp 2013-07-10 08:38:12

+0

就我個人而言,我現在只需在每次更改關聯時手動設置密鑰。修復是一件很好的事情,但經過一番思考,預計POCO無論如何都沒有多大意義。任何改變關聯的操作無論如何都應該在某個領域層方法中抽象出來,所以最終它不會像我想的那樣令人不安。 – 2013-07-10 09:26:31

+0

我是通過dbEntityValidations與所有業務規則「盲」的實體能夠將實體展示給UI層,至少對於「簡單」實體。我使用'entry.related'來處理lazyloading相關實體,但使用detectChanges方法。感謝您的帖子和解決方案。 – danihp 2013-07-10 09:52:06

回答

6

否。實體框架爲您執行此操作。閱讀Relationships and Navigation Properties瞭解更多信息。

通過將新對象分配給導航屬性。以下 代碼創建課程和department之間的關係。 如果對象被附接到上下文中,course也 加到department.Courses集合,並且過程對象上的 相應的外鍵屬性被設置爲的department的 鍵屬性值。

  • course.Department = department;

但是當你發現,你叫SaveChanges或「同步FKS和導航性能之間的變化」部分中提到的其他行動之一後,這只是發生上面鏈接的文件。

如果您正在使用POCO實體,無需代理,您必須確保 該DetectChanges方法被調用到相關 對象在上下文同步。請注意,以下API會自動觸發一次DetectChanges調用。

  • DbSet.Add
  • DbSet.Find
  • DbSet.Remove
  • DbSet.Local
  • DbContext.SaveChanges
  • DbSet.Attach
  • DbContext.GetValidationErrors
  • 的DbContext。條目
  • DbChangeTracke r.Entries
  • 執行LINQ查詢針對DbSet

如果這不是在所有發生,我的猜測是,你有沒有正確定義StoreID爲導航屬性的外鍵Store

+1

我認爲發生了什麼在鏈接的文章底部的「同步FK和導航屬性之間的更改」中進行了介紹。調用'e.Entry(office)'同步這些ID。但是,我可以在調試器中看到代理正在創建,所以它*應該*工作... – 2013-03-21 17:16:49

+0

@IliaJerebtsov啊正確。我最初誤解了你的問題。我以爲你說這根本沒有發生。 – 2013-03-21 17:20:41

+0

謝謝,我已經想通了,顯然缺乏fixup是由DbContext API設計的。 – 2013-03-21 18:09:29

相關問題