3

直到現在我正在使用Visual Studio 2010和Entity Framework 4.x. (數據庫第一)。對於我生成的一些實體類,我添加了部分類定義和一些只讀屬性。爲了得到屬性更改的通知,我可以處理實體的PropertyChanged事件,如果其中一個查詢屬性發生更改,則爲添加的只讀屬性引發PropertyChanged事件。易如反掌。Visual Studio 2012/Entity Framework 5(數據庫優先):如何訂閱部分類中的屬性或集合更改?

最近我切換到Visual Studio 2012,其中默認包含實體框架5。 我從現有數據庫(Database First)創建了一個新模型,並生成了實體類。但似乎生成的類沒有能力使用INotifyPropertyChanged - 因爲它們是POCO類(這是默認的代碼生成策略),因此不像實體框架4.x中那樣從EntityObject派生。

所以我的第一個問題是:在Entity Framework 5(數據庫優先)的情況下,我如何才能通知財產變化?這種方式必須是可能的,因爲WPF中的數據綁定確實有效,即使綁定剛創建的實體類的實例(以便它不是來自上下文查詢的動態實體代理)。

我的第二個問題是:使用實體框架5(數據庫優先),我如何將一個實體對象的關聯集合綁定到一個wpf控件?生成的實體關係的關聯屬性是具有HashSet默認實例的ICollection。因此,當添加或刪除相關的實體對象時,綁定的wpf控件不會收到有關該集合更改的通知(即使在實體集的本地屬性中使用ObservableCollection時,關聯屬性仍然是HashSets而沒有更改通知..) 。

什麼是「打算」的方式來實現這些重要的事情?

在此先感謝, 漢納斯

+0

我會說 - 使用MVVM模式。如果您確實想要基於EntityObject/ObjectContext,則可以在VS2012中通過右鍵單擊EF Designer界面並將代碼生成策略從「無代碼」更改爲「默認值」來執行此操作。 – Pawel

+0

我使用MVVM模式很多,你可能對我的第二個問題是正確的,但在我看來,MVVM不是在生成的POCO中缺少INotifyPropertyChanged實現的答案。在一個單獨的ViewModel中,你必須「包裝」你想獲得變更通知的每個屬性 - 那麼爲什麼然後使用ORM,如果必須實現整個東西兩次? – Hannes

+0

您可以基於實現INotifyPropertyChanged的POCO創建自己的T4模板。並非每個人都需要它,POCO意味着不需要額外的東西。 – Pawel

回答

1

手動方式:你爲什麼不首先使用代碼和有趣的制定者手動提高PropertyChanged事件?很多工作,但很多控制。

動態方法 比方說你有,有一個屬性命名文檔女巫包含生成的EF實體的引用的EditViewModel,你需要綁定到該文檔屬性。

利用適配器設計模式,可以將實體包裝在實現INotifyPropertyChanged的類中,並在調用setter時引發PropertyChanged事件。而不是綁定到綁定到攔截器上的實體引發屬性更改,並使用反射API將屬性調用委託給包裝的實體對象。

你可以在這裏找到巫一個好的爲例目標是使視圖模型執行INotifyPropertyChanged,但你可以爲文件也這麼做:http://www.hightech.ir/SeeSharp/best-implementation-of-inotifypropertychange-ever

相關問題