我有一个带有 UI、业务(实体)和数据 (DbContext) 层的 ASP.NET MVC3 Web 应用程序。我首先使用 Entity Framework 4.1 代码。现在,我正在覆盖数据层中的 DbContext.SaveChanges()
,以便我可以为实现我的 的任何实体对象所做的所有更改设置
接口(interface)。我有一个返回 ModifiedDate
>IAuditableDateTime.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/