Кажется, что поддержка 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 и т. д.?
Спасибо!