Как определить, является ли объект со ссылочными свойствами в EF 4.1 грязным? - PullRequest
2 голосов
/ 29 октября 2011

Кажется, что поддержка Entity.IsDirty должна быть простой, если Entity Framework 4.1 с включенным автоматическим отслеживанием изменений (прокси-объектами) включен.Однако до сих пор я не обнаружил, что это так.

public class DomainContext : DbContext, IDomainContext
{

    /// <summary>
    /// Indicates whether changes have been made to the entity with that have 
    /// not been saved. This method assumes EF Proxies are being used for change tracking.
    /// </summary>
    /// <param name="entityId">The Id of the entity.</param>
    /// <returns>True if the entity is dirty, false otherwise.</returns>
    public bool HasChanges(Guid entityId)
    {
        foreach (DbEntityEntry entry in this.ChangeTracker.Entries())
        {
            IEntity entity = entry.Entity as IEntity;
            if (entity != null)
            {
                if (entity.Id == entityId && entry.State != System.Data.EntityState.Unchanged)
                {
                    return true;
                }
            }
        }
        return false;
    }
}

Похоже, что вышеописанный метод не работает, когда были внесены изменения в свойства объекта, которые являются ссылочными / сложными свойствами.Например:

public class UserPreferences : EntityBase
{

    /// <summary>
    /// Comma delimited list of AFEs for which the user is interested in viewing Events.
    /// </summary>
    public virtual string ViewableAFEs { get; set; }

    /// <summary>
    /// The primary operating area for the user. This is used for defaulting purposes.
    /// </summary>
    public virtual OperatingArea PrimaryOperatingArea
    {
        get { return _primaryOpArea; }
        set
        {
            if (_primaryOpArea != value)
            {
                _primaryOpArea = value;
                RaisePropertyChanged(() => PrimaryOperatingArea);
            }
        }
    }
}

Если я создаю новый класс выше или получаю существующую сущность UserPreferences из базы данных, а затем изменяю свойство PrimaryOperatingArea, DomainContext.HasChanges вернет false.Я считаю, что это происходит потому, что Entity Framework отслеживает сложные и ссылочные свойства в отличие от свойств типа значения.

Изменение свойства ViewableAFEs (строки) действительно отображается как изменение при вызове метода HasChanges, описанного выше.

Мой вопрос заключается в том, как открыть общий метод для моего производного DomainContext, который будет оценивать всесвойства (включая сложные, справочные, типы коллекций) и определить, является ли объект грязным?

Мне любопытно, другие из вас использовали EF 4.1 с использованием EF для функциональности IsDirty или вы свернули свой собственный isDirty отиспользование INotifyPropertyChanged и т. д.?

Спасибо!

1 Ответ

3 голосов
/ 08 ноября 2011

API-интерфейс DbContext уже предоставляет параметры для проверки изменения объекта или некоторых свойств.

  • для проверки изменения объекта:

    var myFooHasChanges = context.Запись (myFoo) .State == EntityState.Modified;

  • для проверки изменения свойства:

    var barWasModified = context.Entry (myFoo) .Property (u => u.Bar) .IsModified;

Вы можете прочитать все об этом в: Использование DbContext в EF 4.1 Часть 5: Работа со значениями свойств

...