2010-10-04 4 views
1

Хорошо, я боролся с этим какое-то время.Общие свойства данных в объектах данных ASP.NET MVC 2

У меня есть стандартный проект MVC2 и используйте EF4 для доступа к объектам данных. Многие мои объекты данных (и, следовательно, таблицы базы данных) имеют два общих поля: UpdateUserAccountID и UpdateDate.

В каждой из моих контроллеров, я в настоящее время настройки этого поля вручную в пределах каждого контроллера на Edit действия:

// POST: /Modes/Edit/2 
    [HttpPost] 
    public ActionResult Edit(int id, FormCollection formValues) 
    { 
     Mode mode = _repository.GetMode(id); 

     //Set update flags 
     mode.UpdateUserAccountID = _userRepository.GetUserID(User.Identity.Name); 
     mode.UpdateDate = DateTime.Now; 

     try 
     { 
      UpdateModel(mode); 
      _repository.Save(); 
      return RedirectToAction("Details", new { id = mode.ModeID }); 
     } 
     catch 
     { 
      return View(mode); 
     } 

    } 

проблема, я хочу, чтобы обновить эти два поля в одном месте, независимо от того, тип контроллера. Я использую шаблон репозитория/IRepository для своих объектов данных. Я также установил BaseController, так как я думал, что могу передать свой объект mode в приведенном выше примере общей функции в базовом контроллере, чтобы установить эти два поля. Но я не мог понять этого, и общая функция не знает об этих конкретных областях.

Должен ли я создавать базовый класс для своих репозиториев? Я не могу предусмотреть, как это будет работать в рамках MVC. В webforms у меня просто был бы интерфейс, который все мои модели реализуют с общими полями, но я, похоже, не вписываюсь в подход MVC.

Любая помощь относительно подхода, который будет принят, будет отличным.

ответ

1

Это сообщение содержит подробное решение для этого сценария: Entity Framework - Auditing Activity

В принципе, идея заключается в том, чтобы обновить общие свойства, как LastModifiedBy или LastModifiedDate на все лицо, прежде чем они сохраняются на хранилище данных на уровне доступа к данным EF с одним общим кодом.

Вы должны избавиться от 2-х строк кода, где вы обновление Установить флаги и пусть все, что происходит в Context_SavingChanges() как способ это было описано в приведенной выше ссылке. Так как вы находитесь в веб-сценарии, вы должны пройти Пользователь.Идентичность.Имя обратно в Repository.Save() метод, а затем вызвать Repository.GetUserID() на Context_SavingChanges(), а также.

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

+0

Это решение работает отлично. Большое спасибо! – Thomas

+0

Добро пожаловать, я рад, что это помогло :) –

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