#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