Как записать измененные значения в базу данных на все действия? - PullRequest
1 голос
/ 01 июня 2011

Контроллер выше имеет стандартное редактирование ActionResult. Я просто нахожу строки в базе данных по идентификатору и обновляю их.
Перед db.SaveChanges () есть статическая функция log.Save (), которая сохраняет все изменения в модели в отдельные таблицы в базе данных.
Она просто проверяет старые и новые значения из ChangeTracker.
Проблема в том, что я хочу использовать log.Save () после db.SaveChanges (), а не раньше, чтобы убедиться, что данные действительно были сохранены.
Но после этого в ChangeTracker нет никаких изменений, поэтому log.Save () не нужно ничего сохранять.

Контроллер:

[HttpPost]
public ActionResult edit(int id, MyModel model)
{
  var hihi = db.MyModel.First(s => s.ID == model.ID);

  hihi.col1 = model.col1;
  hihi.col2 = model.col2;
  ...

  log.Save(Log.ChangeType.Edit, db, id);
      ^ Here i save changes to log.

  db.SaveChanges();


  return RedirectToAction("Index");
}

Класс журнала:

public void Save(ChangeType changeType, DBContext parentContext, int id)
{
  DBContext db = new DBContext();

  foreach (System.Data.Entity.Infrastructure.DbEntityEntry ee in parentContext.ChangeTracker.Entries())
  {
    foreach (string column in ee.OriginalValues.PropertyNames)
    {
      string oldValue = ee.OriginalValues[column].ToString();
      string newValue = ee.CurrentValues[column].ToString();

      if (oldValue != newValue)
      {
         var model = new LogModel
         {
            Log_Time = DateTime.Now,
            Log_Operator = User.Ope_ID,
            Log_Table = ee.Entity.ToString().Replace("xxx.Models.", ""),
            Log_Key = id,
            Log_Column = column,
            Log_Type = (int)changeType,
            Log_OldValue = oldValue,
            Log_NewValue = newValue
          };

          var log = db.Log.Add(model);
          db.SaveChanges();
        }
      }
   }
}

public enum ChangeType
{
  Create = 1,
  Delete = 2,
  Edit = 3
}

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

Ответы [ 2 ]

2 голосов
/ 01 июня 2011

SaveChanges в EF4 - виртуальный , так что вы можете переопределить его, добавить пользовательское ведение журнала и т. Д.

0 голосов
/ 29 марта 2012

Почему бы вам не использовать try{} catch{} в Log Class и изменить параметр возврата с 'void' на 'bool'.Это вернет true, если db.SaveChanges() завершится успешно.Затем в «ActionResult edit» используйте bool result = log.Save(Log.ChangeType.Edit, db, id);, чтобы узнать, сохранил ли журнал изменения, а затем используйте простое предложение if, чтобы проверить, можете ли вы сохранить все изменения в БД или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...