2015-09-23 12 views
3

Я разрабатываю приложение 5 MVC с помощью EF 6. Автоматически созданный метод POST для редактирования:Как проверить, какие свойства/записи модифицируются и которые не включены Редактирование записи в EF 6

public ActionResult Edit([Bind(Include = "Id,Name,Address,Phone,SSNo,D1")] ABC abc) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(abc).State = EntityState.Modified; 
     db.SaveChanges(); 
    } 
    return View(abc); 
} 

Есть ли какая-либо процедура/метод, с помощью которого я могу получить, какие записи были изменены и каковы исходные значения этих записей. Я пробовал метод, помеченный как ответ в вопросе this, но он не получил никаких изменений, хотя изменения были сделаны, т. Е. Цикл не выполняет итерации.

Мой код:

public ActionResult Edit([Bind(Include = "Id,Name,Address,Phone,SSNo,D1")] ABC abc) 
{ 
    if (ModelState.IsValid) 
    { 
      db.ABCs.Attach(abc); 
      var myObjectState = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager.GetObjectStateEntry(abc); 
      var modifiedProperties = myObjectState.GetModifiedProperties(); 
      foreach (var propName in modifiedProperties) 
      { 
       Console.WriteLine("Property {0} changed from {1} to {2}", 
       propName, 
       myObjectState.OriginalValues[propName], 
       myObjectState.CurrentValues[propName]); 
      } 
      Console.ReadKey(); 
      db.Entry(abc).State = EntityState.Modified; 
      db.SaveChanges(); 
      return Json(abc); 
    } 
    return View(abc); 
} 

ABC модель содержит много других значений, чем указанные в параметрах метода, но я лишь вскользь те, которые могут быть отредактированы

То, что я пытаюсь сделать, это сохранить войдите в мою базу данных обо всех изменениях, внесенных в документ. Я хочу включать только изменения и исходные значения до внесения изменений в журнал, а не полную запись.

Как я могу это получить?

+0

_ "Но я не могу их использовать." _ - почему? – CodeCaster

+0

Я не понимаю, как их использовать .. У них разные типы –

+1

См. [Дубликат] (http://stackoverflow.com/questions/3265257/getting-all-changes-made-to-an-object-in-the -entity-framework), это объясняется довольно хорошо там. Обновите свой вопрос с помощью фактического кода, если вы не можете заставить его работать. – CodeCaster

ответ

3

Я реализовал этот метод расширения для вас:

namespace YourProject.Extensions 
{ 
    public static class ModelExtensions 
    { 
     public static IEnumerable<KeyValuePair<string, object>> ModifiedValues<T>(this T obj, T modifiedObject) 
     { 
      foreach (var property in typeof(T).GetProperties().Where(p => !p.GetGetMethod().IsVirtual)) 
      { 
       if (property.GetValue(obj).ToString() != property.GetValue(modifiedObject).ToString()) 
       { 
        yield return new KeyValuePair<string, object>(property.Name, property.GetValue(modifiedObject)); 
       } 
      } 
     } 
    } 
} 

Это не является ни самым быстрым, ни самым эффективным, но работал в моих тестах.

Использование:

var originalEntity = await db.Entities.AsNoTracking().FirstOrDefaultAsync(e => e.EntityId == modifiedEntity.EntityId); 
var modifiedValues = originalEntity.ModifiedValues<MyEntity>(modifiedEntity).ToList(); 
+1

СПАСИБО много .. Это очень помогло мне. Еще раз спасибо, очень сильно за письмо для продления. Мне полегчало, –

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

  • Нет связанных вопросов^_^