2014-05-30 14 views
2

У меня есть следующий Update универсальный метод для моих сущностей:EF 6 OriginalValues ​​потерявшие при использовании метода Attach

public void Update <T> (T entity) where T: class { 
    DbEntityEntry dbEntityEntry = DbContext.Entry(entity); 
    if (dbEntityEntry.State == System.Data.Entity.EntityState.Detached) { 

     DbContext.Set <T>().Attach(entity); 

    } 
    dbEntityEntry.State = System.Data.Entity.EntityState.Modified; 
} 

После SaveChanges() данные успешно обновляется в БД.

Теперь я урожденная реализовать и журнал аудита, прежде чем SaveChanges(), но я заметил, что CurrentValues равны OriginalValues:

// For updates, we only want to capture the columns that actually changed 
if (!object.Equals(dbEntry.OriginalValues.GetValue<object>(propertyName), dbEntry.CurrentValues.GetValue<object>(propertyName))){ 

    //here I add a new Audit Log entity 

} 

Любой ключ о том, как решить эту проблему? Или есть лучший способ сделать это в Entity Framework 6?

ответ

1

Исходные значения восстанавливаются из самой сущности. Если объект отслеживается контекстом, эта информация доступна.

В вашем случае вы используете незащищенную сущность, поэтому отслеживания изменений не происходит, и сущность не имеет исходных значений.

В этом случае, если вам нужны исходные значения, нет другого выбора, кроме как получить их из БД и сравнить их один за другим.

Если вы хотите получить сущность, которая ведет себя так, как если бы она была отслежена контекстом, вы можете использовать контекст для чтения сущности из БД и использовать что-то вроде ValueInjecter, чтобы автоматически устанавливать значения свойств из объекта, в отслеживаемый объект.

+0

Вы совершенно правы! Мне нужно получить из БД исходную сущность, а затем выполнить сравнение. Не знаю, может ли это замедлить работу приложения. – VAAA

+1

Конечно, это медленнее: вы дважды попадаете в базу данных, и это относительно дорого. Однако не беспокойтесь о производительности приложения, если у вас нет этой проблемы. Другими словами: не тратьте время на повышение производительности, если у вас нет проблемы с производительностью. В это время вы планируете внедрять функции. Пожалуйста, если вы считаете, что это правильный ответ, примите его. – JotaBe