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

#entity-framework #entity

#entity-framework #объект

Вопрос:

Похоже, это вспомогательный объект.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 amp;amp; 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:

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

  • чтобы проверить, был ли изменен объект:

    var myFooHasChanges = контекст.Запись (myFoo).Состояние == EntityState .Изменено;

  • чтобы проверить, было ли изменено свойство:

    var barWasModified = контекст.Запись (myFoo).Свойство (u => u.Bar).IsModified;

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

Комментарии:

1. Кажется, много работы, чтобы определить, изменилось ли какое-либо свойство для данного объекта, но вы ответили на мои вопросы. Спасибо за вашу помощь. Отметьте свой ответ как ответ.

2. Вы могли бы автоматизировать проверку всех свойств внутри объекта с помощью отражения. Проверьте это: msdn.microsoft.com/en-us/library/ms173183(v=VS.100).aspx