c# - 覆盖 SaveChanges 并设置 ModifiedDate,但如何设置 ModifiedBy?

标签 c# asp.net-mvc-3 entity-framework-4.1 ef-code-first

我有一个带有 UI、业务(实体)和数据 (DbContext) 层的 ASP.NET MVC3 Web 应用程序。我首先使用 Entity Framework 4.1 代码。现在,我正在覆盖数据层中的 DbContext.SaveChanges(),以便我可以为实现我的 的任何实体对象所做的所有更改设置 ModifiedDate >IAuditable 接口(interface)。我有一个返回 DateTime.Now 的静态 DateProvider 类和方法 (GetCurrentDate)(除非我正在运行测试,在这种情况下,它会返回我告诉它的任何内容).

我也想自动将 ModifiedBy 属性设置为当前用户。执行此操作的最佳方法是什么?框架中是否内置了允许我访问此信息的内容,或者我是否需要设置类似于 DateProvider 类的内容?这是一个 Active Directory 环境,我们在 IIS 中使用 WindowsAuthentication

这是我的 SaveChanges 代码:

public override int SaveChanges()
{
    var changeSet = ChangeTracker.Entries<IAuditable>();

    if (changeSet != null)
    {
        foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged))
        {
            entry.Entity.ModifiedDate = DateProvider.GetCurrentDate();
        }
    }
    return base.SaveChanges();
}

最佳答案

您可以使用 HttpContext.Current.User.Identity.Name 获取当前用户的名称。

public override int SaveChanges()
{
    var changeSet = ChangeTracker.Entries<IAuditable>();

    if (changeSet != null)
    {
        foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged))
        {
            entry.Entity.ModifiedDate = DateProvider.GetCurrentDate();
            entry.Entity.ModifiedBy = HttpContext.Current.User.Identity.Name;
        }
    }
    return base.SaveChanges();
}

更好的方法是使用构造函数注入(inject)将当前用户传递给上下文

public class MyContext : DbContext
{
    public MyContext(string userName)
    {
        UserName = userName;
    }

    public string UserName
    {
        get; private set;
    }

    public override int SaveChanges()
    {
       var changeSet = ChangeTracker.Entries<IAuditable>();

       if (changeSet != null)
       {
          foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged))
          {
              entry.Entity.ModifiedDate = DateProvider.GetCurrentDate();
              entry.Entity.ModifiedBy = UserName;
          }
       }
       return base.SaveChanges();
   }
}

关于c# - 覆盖 SaveChanges 并设置 ModifiedDate,但如何设置 ModifiedBy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7641552/

相关文章:

entity-framework - Entity Framework 和带有自定义实体的存储过程

c# - 使用 ASP.NET Core 的应用程序和用户身份验证

c# - SaveCopyAs 方法不起作用

c# - 通过引用将 int 从 C++/CLI 传递到 C#

asp.net-mvc-3 - 如何重定向到 URL?

c# - Entity Framework 代码优先 - 具有连接/链接表的一对多

asp.net - Entity Framework 4.1 - 选择多对多关联

c# - 我想在加载任何表单时自动调用程序中编写的方法

c# - 避免泄露 CSHTML 和 javascript 的源代码

ajax - FullCalendar:事件不显示加载但显示如果我打开 IE 开发人员