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();
我希望所有属性都有这种行为。 我错过了模型设计师的设置,还是有其他解决方案?
感谢名单!
答案 0 :(得分:1)
T4模板的重点是允许您进行所需的修改。这是绝对错误的说法:
但我不想在我的项目中使用自定义模板!
这就像抛弃了T4模板的所有优点,并回到硬编码的自定义工具进行代码生成。
答案 1 :(得分: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)#>();
}
希望这对别人有所帮助。