Entity Framework 4: событие PropertyChanged вызывается слишком часто - PullRequest
3 голосов
/ 08 сентября 2011

сгенерированный из 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();

Этот код не проверяет, действительно ли значение изменилось (в установщике). Поэтому событие 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();

Я бы ожидал такого поведения от всех свойств. Я пропускаю настройку в конструкторе моделей или есть другое решение?

Thanx!

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Я сделал, поскольку знал, что это возможно, и Ладислав также заявил, что включил файл шаблона 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)#>();
            }

Надеюсь, что это поможет другим.

1 голос
/ 08 сентября 2011

Это точка шаблона T4, позволяющая вам вносить необходимые изменения. Это абсолютно неправильный подход, чтобы сказать:

Но я бы не хотел использовать собственный шаблон в моем проекте!

Это все равно что отбросить все преимущества шаблонов T4 и вернуться к жестко закодированным пользовательским инструментам для генерации кода.

...