Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 4 实体框架4:引发PropertyChanged事件太频繁_Entity Framework 4_Inotifypropertychanged - Fatal编程技术网

Entity framework 4 实体框架4:引发PropertyChanged事件太频繁

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

从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();
//
///没有可用的元数据文档。
/// 
[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的问题的快速帮助!!:)