Entity framework 4 实体框架4:引发PropertyChanged事件太频繁
从EF为实体的属性生成的代码如下所示:Entity framework 4 实体框架4:引发PropertyChanged事件太频繁,entity-framework-4,inotifypropertychanged,Entity Framework 4,Inotifypropertychanged,从EF为实体的属性生成的代码如下所示: /// <summary> /// No Metadata Documentation available. /// </summary> [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] [DataMemberAttribute()] publ
/// <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();
//
///没有可用的元数据文档。
///
[EdmScalarPropertyAttribute(EntityKeyProperty=false,IsNullable=false)]
[DataMemberAttribute()]
公共全局::System.DateTime DateCreated
{
得到
{
返回日期已创建;
}
设置
{
OnDateCreatedChange(值);
ReportPropertyChange(“DateCreated”);
_DateCreated=StructuralObject.SetValidValue(值);
ReportPropertyChanged(“DateCreated”);
OnDateCreatedChanged();
}
}
私有全局::System.DateTime\u DateCreated;
部分无效OnDateCreatedChange(全局::System.DateTime值);
部分无效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();
//
///没有可用的元数据文档。
///
[EdmScalarPropertyAttribute(EntityKeyProperty=true,IsNullable=false)]
[DataMemberAttribute()]
公共全局::System.Guid Id
{
得到
{
返回_Id;
}
设置
{
如果(_Id!=值)
{
onidchange(值);
报告财产变更(“Id”);
_Id=StructuralObject.SetValidValue(值);
ReportPropertyChanged(“Id”);
OnIdChanged();
}
}
}
私有全局::System.Guid\u Id;
部分无效OnidChange(全局::System.Guid值);
部分无效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)#>();
}
如果(!Object.Equals(,value))
{
(价值);
报告财产变更(“”);
=StructuralObject.SetValidValue(值);
报告财产变更(“”);
();
}
希望这将对其他人有所帮助。我知道我可以为此定制T4模板。。。但是我不希望在我的项目中使用自定义模板!这是一个正确的观点。但我有理由不愿意这样做。引入修改生成代码的可能性,将使我的合作开发人员希望进行更多的更改,从而破坏任何良好的设计。现在我可以告诉他们:“事情就是这样!”。在大多数情况下,它是好的。正如你们所看到的,有时候除了技术上的原因,还有其他的原因。开发者应该开发并做他认为好的改变。它不是奴隶——他对自己所做的改变负有责任,他必须能够解释他为什么做出改变。如果您不信任您的合作开发人员,您需要代码审查过程。请允许我说,我非常感谢您的专业知识和对我最后几个有关EF的问题的快速帮助!!:)