2010-09-12 86 views
2

我有一個類實體框架生成的地址。 我在這門課有一個propertie AddressID。實體框架4,自定義屬性。添加一些trabilityment

我希望能夠在設置過程中爲此道具添加一些處理措施。 EX:

public partial class Address 
    { 
     public bool _AddressID; 
     public bool AddressID{get return AddressID;} 
     set{ 
      if(value == -1) _AddressID = null; 
     } 
    } 

感謝

回答

2

當然你不能重新定義AddressID爲了把您的定製邏輯在其制定者,因爲你會得到編譯器錯誤:
的類型地址已經包含了「AddressID」

但是,沒有後顧之憂的定義,如果你看看你的EntityObject的EF生成的代碼(我們假設它的名字地址),你會看到生成的每一個標量屬性地址類有它自己的版本OnPropertyChangingOnPropertyChanged方法。例如,OnAddressIDChangingOnAddressIDChanged在這種情況下。

正如你在下面看到的,這兩個方法沒有默認的實現,只有一個聲明。這完美地爲您提供執行自定義邏輯 的機會,因爲屬性即將更改(PropertyChanging)以及剛纔屬性 值已更改(PropertyChanged)。

// From the designer code for Address class: 
partial void OnAddressIDChanging(global::System.Int32 value); 
partial void OnAddressIDChanged(); 


這是怎麼了你的實體模型設計器的代碼已經被看起來像(hypotetically):

public global::System.Int32 AddressID { 
    get { 
     return _AddressID; 
    } 
    set { 
     if (_AddressID != value) { 
      // OnPropertyChanging method get called here: 
      OnAddressIDChanging(value); 

      ReportPropertyChanging("AddressID"); 
      _AddressID = StructuralObject.SetValidValue(value); 
      ReportPropertyChanged("AddressID"); 

      // OnPropertyChanged get called here: 
      OnAddressIDChanged(); 
     } 
    } 
} 


因此,所有你需要以掛鉤做你的自定義代碼是:

public partial class Address { 
    partial void OnAddressIDChanged() { 
     if(AddressID == -1) {    
      AddressID = 0; 
     } 
    }  
} 



順便說一句,關於其他發佈的答案 - 儘可能尊重他們 - 如果你想爲生產應用程序提供這種解決方案,那麼你不能使用「Code First」,因爲它現在只是一個CTP, EF的下一個版本的一部分,所以它不能成爲一個選項。
關於自定義默認代碼生成,雖然在VS 2010中確實可行,但實體框架本身也使用T4進行設計器代碼生成,我們可以通過更改T4來利用它,但僅當您想要從根本上改變實體類的生成方式,並且不能用它來爲特定的實體定製設置器邏輯。

+0

您的解決方案非常好。但是,當我嘗試它,IIS停止運行,我的網頁停止響應。你知道爲什麼嗎 。 – 2010-09-13 00:44:42

+0

對不起,我忘了在部分功能中添加一個條件。 – 2010-09-13 00:52:07

+0

不客氣。我很高興它有幫助。順便說一句,在你的自定義OnAddressIDChanged方法中放置一個斷點,看看它是如何調用的。讓我知道如果你有任何進一步的問題:) – 2010-09-13 01:04:07

0

代碼首先在EF4是一種選擇 - 它可以讓你完全控制所有的代碼。但是,另一種選擇是自定義EF4附帶的EF4 T4模板。如果你在你的代碼中有一些特定的模式,你會一直使用,這將是一個很好的方法。你可以閱讀更多有關如何自定義此模板:Customizing Entity Classes in VS2010