2015-02-05 4 views
2

Я пытаюсь переопределить метод Entity Framework SaveChanges(), чтобы сохранить информацию аудита. Я начинаю со следующим:EF ObjectStateEntry OriginalValues ​​содержит CurrentValues ​​

public override int SaveChanges() 
{ 
    ChangeTracker.DetectChanges(); 
    ObjectContext ctx = ((IObjectContextAdapter)this).ObjectContext; 
    List<ObjectStateEntry> objectStateEntryList = ctx.ObjectStateManager.GetObjectStateEntries(
                 EntityState.Added 
                 | EntityState.Modified 
                 | EntityState.Deleted).ToList(); 

    foreach (ObjectStateEntry entry in objectStateEntryList) 
    { 
     if (!entry.IsRelationship) 
     { 
      //Code that checks and records which entity (table) is being worked with 
      ... 

      foreach (string propertyName in entry.GetModifiedProperties()) 
      { 
       DbDataRecord original = entry.OriginalValues; 
       string oldValue = original.GetValue(original.GetOrdinal(propertyName)).ToString(); 

       CurrentValueRecord current = entry.CurrentValues; 
       string newValue = current.GetValue(current.GetOrdinal(propertyName)).ToString(); 

       if (oldValue != newValue) 
       { 
        AuditEntityField field = new AuditEntityField 
        { 
         FieldName = propertyName, 
         OldValue = oldValue, 
         NewValue = newValue, 
         Timestamp = auditEntity.Timestamp 
        }; 
        auditEntity.AuditEntityField.Add(field); 
       } 
      } 
     } 
    } 
} 

Проблема у меня в том, что значения я получаю в entry.OriginalValues и в entry.CurrentValues всегда новое обновленное значение:

Audit Entity State

ответ

1

Проблема была найдена :

public ActionResult Edit(Branch branch) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(branch).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(branch); 
} 

Сохранение обновления в вышеуказанном виде, по-видимому, приводит к тому, что ChangeTracker не будет получать старые значения. Я исправил это, просто используя ViewModels для всех необходимых обновлений:

public ActionResult Edit(BranchViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     Branch branch = db.Branch.Find(model.BranchId); 

     if (branch.BranchName != model.BranchName) 
     { 
      branch.BranchName = model.BranchName; 
      db.SaveChanges(); 
     } 
     return RedirectToAction("Index"); 
    } 
    return View(model); 
} 
+1

с той же проблемой, но разве это ошибка? не могли бы предположить, что нам придется сначала проверить каждое свойство и решить, если мы сохраним или нет.?! :/ – mxii

+0

В первом методе EF ничего не знает об исходной стоимости объекта. Кажется, это логично, если исходные значения такие же, как и текущее значение. Проверьте http://stackoverflow.com/questions/9588352/entity-framework-dbcontext-savechanges-originalvalue-incorrect –

Смежные вопросы