EF为一个实体的属性生成的代码如下所示:
/// <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();
这段代码没有检查值是否已经改变(在setter中)。因此,即使您设置的值等于当前值,也会引发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();
我希望所有属性都有这种行为。我是否错过了模型设计器中的设置,或者是否有其他解决方案?
谢谢!
这是T4模板允许您修改您需要的点。这是绝对错误的做法:
但我宁愿不使用自定义模板在我的项目!
这就像抛弃T4模板的所有优点,回到硬编码的自定义工具来生成代码。
我做了,因为我知道这是可能的,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)#>();
}
希望对大家有所帮助。