【问题标题】:Entity Framework 4: PropertyChanged event is raised too often实体框架 4:PropertyChanged 事件被频繁引发
【发布时间】:2011-09-08 14:21:23
【问题描述】:

从 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 模板...但我宁愿不在我的项目中使用自定义模板!

标签: entity-framework-4 inotifypropertychanged


【解决方案1】:

T4 模板允许您进行所需的修改。这是绝对错误的说法:

但我宁愿不在我的项目中使用自定义模板!

这就像丢掉 T4 模板的所有优点,转而使用硬编码的自定义工具来生成代码。

【讨论】:

  • 这是一个有效的观点。但我有理由不愿意这样做。引入修改生成代码的可能性,将使我的共同开发人员想要进行更多的更改,从而破坏任何好的设计。到目前为止,我可以告诉他们:“就是这样!”。对于大多数部分来说,它的方式很好。如您所见,有时做出决定的原因并非技术原因。
  • 开发者的目的是开发和做他认为好的改变。它不是奴隶——他对他所做的改变负有责任,他必须能够解释他为什么做出这些改变。如果您不信任您的合作开发者,您需要进行代码审查流程。
  • 让我说,我非常感谢您的专业知识和对我最后几个关于 EF 的问题的快速帮助! :)
【解决方案2】:

我知道这是可能的,而且 Ladislav 也说过,我确实将 T4 模板文件包含到项目中,并对“写入 PrimitiveType 属性”进行了以下更改。部分模板:

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

希望对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    相关资源
    最近更新 更多