实体框架4:PropertyChanged事件被频繁触发



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)#>();
            }

希望对大家有所帮助。

相关内容

  • 没有找到相关文章

最新更新