一尘不染

覆盖SaveChanges并设置ModifiedDate,但是如何设置ModifiedBy?

c#

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

我也想自动将ModifiedBy属性设置为当前用户。这样做的最佳方法是什么?框架中是否有内置的东西可以让我访问此信息,还是需要设置类似该类的东西DateProvider?这是一个Active
Directory环境,我们WindowsAuthentication在IIS中使用。

这是我的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();
}

阅读 479

收藏
2020-05-19

共1个答案

一尘不染

您可以使用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();
}

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

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();
   }
}
2020-05-19