ASP.NET MVC 2数据对象中的公共数据属性

时间:2010-10-04 15:01:05

标签: asp.net-mvc entity-framework-4

好的,我一直在努力解决这个问题。

我有一个标准的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方法。

任何有关采取方法的帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

此帖子包含此方案的详细解决方案: 的 Entity Framework - Auditing Activity

基本上,我们的想法是如何在所有实体上使用一个公共代码保存在EF数据访问层的数据存储上之前,更新所有实体上的 LastModifiedBy LastModifiedDate 等公共属性。

您应该删除设置更新标志的2行代码,并让它们全部发生在 Context_SavingChanges()中,就像上面链接中描述的那样。由于您处于Web场景中,因此必须将 User.Identity.Name 传递回Repository.Save()方法,然后在其上调用 Repository.GetUserID() Context_SavingChanges()

这样,每次将实体插入或更新到数据存储时,都不需要更新这两个属性。它会在保存之前自动发生在一个地方。