當然你不能重新定義AddressID爲了把您的定製邏輯在其制定者,因爲你會得到編譯器錯誤:
的類型地址已經包含了「AddressID」
但是,沒有後顧之憂的定義,如果你看看你的EntityObject的EF生成的代碼(我們假設它的名字地址),你會看到生成的每一個標量屬性地址類有它自己的版本OnPropertyChanging和OnPropertyChanged方法。例如,OnAddressIDChanging和OnAddressIDChanged在這種情況下。
正如你在下面看到的,這兩個方法沒有默認的實現,只有一個聲明。這完美地爲您提供執行自定義邏輯 的機會,因爲屬性即將更改(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來利用它,但僅當您想要從根本上改變實體類的生成方式,並且不能用它來爲特定的實體定製設置器邏輯。
您的解決方案非常好。但是,當我嘗試它,IIS停止運行,我的網頁停止響應。你知道爲什麼嗎 。 – 2010-09-13 00:44:42
對不起,我忘了在部分功能中添加一個條件。 – 2010-09-13 00:52:07
不客氣。我很高興它有幫助。順便說一句,在你的自定義OnAddressIDChanged方法中放置一個斷點,看看它是如何調用的。讓我知道如果你有任何進一步的問題:) – 2010-09-13 01:04:07