实体框架4:PropertyChanged事件过于频繁地引发

时间:2011-09-08 14:21:23

标签: entity-framework-4 inotifypropertychanged

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

我希望所有属性都有这种行为。 我错过了模型设计师的设置,还是有其他解决方案?

感谢名单!

2 个答案:

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

希望这对别人有所帮助。