我有一个带有UI,业务(实体)和数据(DbContext)层的ASP.NET MVC3 Web应用程序。我正在使用Entity Framework 4.1 Code First。现在,我将覆盖DbContext.SaveChanges()Data层,以便可以为ModifiedDate对实现我的IAuditable接口的任何实体对象所做的所有更改设置。我有一个静态的DateProvider类和方法(GetCurrentDate)返回DateTime.Now(除非我正在运行测试,在这种情况下,它将返回我告诉它的内容)。
DbContext.SaveChanges()
ModifiedDate
IAuditable
DateProvider
DateTime.Now
我也想自动将ModifiedBy属性设置为当前用户。这样做的最佳方法是什么?框架中是否有内置的东西可以让我访问此信息,还是需要设置类似该类的东西DateProvider?这是一个Active Directory环境,我们WindowsAuthentication在IIS中使用。
ModifiedBy
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获取当前用户的名称。
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(); } }