【问题标题】:Common Data Properties In ASP.NET MVC 2 Data ObjectsASP.NET MVC 2 数据对象中的通用数据属性
【发布时间】:2010-10-04 15:01:05
【问题描述】:

好的,我已经为此苦苦挣扎了一段时间。

我有一个标准的 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,因为我认为我可以将上面示例中的“模式”对象传递给基本控制器中的通用函数来设置这两个字段。但是,我想不通,通用函数不知道这些特定的字段。

我应该为我的存储库创建一个基类吗?我无法想象这将如何在 MVC 框架中工作。在 web 表单中,我只需要一个接口,我的所有模型都使用公共字段实现,但我似乎无法将其融入 MVC 方法。

对于采取的方法的任何帮助都会很棒。

【问题讨论】:

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


    【解决方案1】:

    这篇文章包含此场景的详细解决方案: Entity Framework - Auditing Activity

    基本上,这个想法是如何在所有实体上使用一个通用代码将它们保存在 EF 数据访问层的数据存储中之前更新它们的通用属性,例如 LastModifiedByLastModifiedDate

    您应该摆脱 Set update flags 的两行代码,并让这一切都发生在 Context_SavingChanges() 中,就像上面链接中描述的那样.由于您处于网络场景中,因此您必须将 User.Identity.Name 传递回您的 Repository.Save() 方法,然后调用 Repository.GetUserID() Context_SavingChanges() 也是如此。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多