2011-09-08 51 views
3

從EF生成的代碼爲實體的屬性看起來是這樣的:實體框架4:PropertyChanged事件經常被人提出

 /// <summary> 
     /// No Metadata Documentation available. 
     /// </summary> 
     [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] 
     [DataMemberAttribute()] 
     public global::System.DateTime DateCreated 
     { 
      get 
      { 
       return _DateCreated; 
      } 
      set 
      { 
       OnDateCreatedChanging(value); 
       ReportPropertyChanging("DateCreated"); 
       _DateCreated = StructuralObject.SetValidValue(value); 
       ReportPropertyChanged("DateCreated"); 
       OnDateCreatedChanged(); 
      } 
     } 
     private global::System.DateTime _DateCreated; 
     partial void OnDateCreatedChanging(global::System.DateTime value); 
     partial void OnDateCreatedChanged(); 

這個代碼不檢查值實際上有沒有改變(在二傳手)。因此,即使您設置的值等於當前值,也會引發PropertyChanged事件。但是,在這種情況下,什麼事都不會發生變化,所以我不希望這個事件......

有關的EntityKey屬性他們不檢查:

 /// <summary> 
     /// No Metadata Documentation available. 
     /// </summary> 
     [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] 
     [DataMemberAttribute()] 
     public global::System.Guid Id 
     { 
      get 
      { 
       return _Id; 
      } 
      set 
      { 
       if (_Id != value) 
       { 
        OnIdChanging(value); 
        ReportPropertyChanging("Id"); 
        _Id = StructuralObject.SetValidValue(value); 
        ReportPropertyChanged("Id"); 
        OnIdChanged(); 
       } 
      } 
     } 
     private global::System.Guid _Id; 
     partial void OnIdChanging(global::System.Guid value); 
     partial void OnIdChanged(); 

我希望所有的屬性此行爲。 我在模型設計器中缺少一個設置,還是有其他解決方案?

Thanx!

+0

而且我知道我可以爲此定製T4模板......但我寧願不在我的項目中使用自定義模板! – SolarX

回答

1

這是T4模板的要點,可以讓您進行需要的修改。這是絕對錯誤的方法來說:

但我寧願不在我的項目中使用自定義模板!

這就好比把T4模板的所有優點都拋開了,並返回硬編碼的定製工具來生成代碼。

+0

這是一個有效的觀點。但我有理由不願意這樣做。介紹修改生成的代碼的可能性,會讓我的合作開發人員想要做出更多的改變,這會破壞任何優秀的設計。截至目前,我可以告訴他們:「就是這樣!」。而對於大部分零件來說,這是很好的方式。正如你所看到的,有時候除了決定的技術原因之外。 – SolarX

+0

開發人員的目的是開發和改變他認爲很好的改變。這不是一個奴隸 - 他有責任改變他所做的事情,他必須能夠解釋他爲什麼要這樣做。如果你不相信你的合作開發者,你需要代碼審查過程。 –

+0

讓我說,我接受感謝你的專業知識和快速幫助我關於EF的最後幾個問題! :) – SolarX

1

因爲我知道這是可能的,Ladislav也說過,將T4模板文件包含到項目中,並對「Write PrimitiveType Properties」進行了以下更改。部分模板:

  if (!Object.Equals(<#=code.FieldName(primitiveProperty)#>, value)) 
      { 
       <#=ChangingMethodName(primitiveProperty)#>(value); 
       ReportPropertyChanging("<#=primitiveProperty.Name#>"); 
       <#=code.FieldName(primitiveProperty)#> = StructuralObject.SetValidValue(value<#=OptionalNullableParameterForSetValidValue(primitiveProperty, code)#>); 
       ReportPropertyChanged("<#=primitiveProperty.Name#>"); 
       <#=ChangedMethodName(primitiveProperty)#>(); 
      } 

希望對他人有幫助。