2011-06-01 81 views

回答

16

代理所必需的兩個特點:

  • 延遲加載 - 導航屬性加載一次訪問的第一次
  • 變化動態跟蹤 - 如果你在實體修改任何屬性的情況下被告知這個變化並設置實體的狀態。如果不使用動態更改跟蹤,則上下文必須使用快照更改跟蹤,這意味着在進行保存之前發現所有更改=即使未更改,也要瀏覽所有屬性。

這兩種技術都有其他要求:

  • 延遲加載 - 在實體的所有導航屬性必須是virtual。延遲加載必須啓用。
  • 動態更改跟蹤 - 所有映射的屬性必須是virtual
+0

嗨,我有一個問題,如果你可以幫忙嗎? ChangeTracker跟蹤附加到上下文的任何實體。因此,如果我更改實體的任何屬性,它將被標記爲已修改。所以這意味着無論如何都要跟蹤它,而不使用虛擬關鍵字。由於已經通過上下文跟蹤標量屬性,因此需要設置標量屬性。但據說標量屬性標記爲虛擬變化跟蹤。除了我提到的以外,哪些更改跟蹤會影響虛擬關鍵字對標量屬性的影響? – UfukSURMEN 2017-01-01 15:13:27

+1

@UfukSURMEN Ladislav在回答中提到了不同類型的變化追蹤。 「虛擬」屬性啓用動態跟蹤,每次屬性發生變化時都會發出通知。無需使用'virtual'關鍵字,就可以使用快照跟蹤,將每個屬性的值與它們之前在'DetectChanges()'上的值進行比較。你應該使用哪一個是[微妙問題](https://blog.oneunicorn.com/2011/12/05/should-you-use-entity-framework-change-tracking-proxies/)。 – 2017-03-10 10:44:26

+0

@BobSammers感謝您的回覆,以及關於此主題的不錯文章。 – UfukSURMEN 2017-03-11 13:05:45

2

除了以前的答案,運行時使用您的POCO類使用反射,並創建一個動態代理類繼承您的POCO類。因此它將在運行時添加這些功能+ EntityObject功能,這將有助於動態代理啓用延遲加載和動態更改跟蹤。