好的,我一直在努力解决这个问题。
我有一个标准的MVC2项目并使用EF4来访问数据对象。我的许多数据对象(以及数据库表)都有两个常见字段:UpdateUserAccountID和UpdateDate。
在我的每个控制器中,我当前在编辑操作的每个控制器中手动设置这些字段:
// 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);
}
}
问题是,无论控制器的类型如何,我都希望在中心位置更新这两个字段。我正在为我的数据对象使用Repository / IRepository模式。我也设置了一个BaseController,因为我认为我可以将上面例子中的'mode'对象传递给基本控制器中的泛型函数来设置这两个字段。但是,我无法理解这一点,并且通用功能不了解这些特定领域。
我应该为我的存储库创建基类吗?我无法想象这将如何在MVC框架内工作。在webforms中,我只有一个接口,我的所有模型都使用公共字段实现,但我似乎无法将其融入MVC方法。
任何有关采取方法的帮助都会很棒。
答案 0 :(得分:1)
此帖子包含此方案的详细解决方案:
的 Entity Framework - Auditing Activity 强>
基本上,我们的想法是如何在所有实体上使用一个公共代码保存在EF数据访问层的数据存储上之前,更新所有实体上的 LastModifiedBy 或 LastModifiedDate 等公共属性。
您应该删除设置更新标志的2行代码,并让它们全部发生在 Context_SavingChanges()中,就像上面链接中描述的那样。由于您处于Web场景中,因此必须将 User.Identity.Name 传递回Repository.Save()方法,然后在其上调用 Repository.GetUserID() Context_SavingChanges()。
这样,每次将实体插入或更新到数据存储时,都不需要更新这两个属性。它会在保存之前自动发生在一个地方。