当我的数据库中的记录得到更新时,我需要能够保存编辑它的人。
目前在我的存储库中我这样做
pt.ModifiedBy = HttpContext.Current.User.Identity.Name;
必须有更好的方法来做到这一点,还是这是唯一的方法?
当我的数据库中的记录得到更新时,我需要能够保存编辑它的人。
目前在我的存储库中我这样做
pt.ModifiedBy = HttpContext.Current.User.Identity.Name;
必须有更好的方法来做到这一点,还是这是唯一的方法?
通过使用HttpContext.Current.User
,您将与您紧密耦合DbContext
,HttpContext
这不是一个好主意,以防您将您暴露DbContext
于非 Web 环境(UnitTesting、WCF、WPF 等)。
您可以System.Security.Principal.IIdentity
改用,就像在ASP.NET ( System.Web.HttpContext.Current.User.Identity
)、WCF ( System.ServiceModel.OperationContext.Current.ServiceSecurityContext.PrimaryIdentity
) 和Thread ( Thread.CurrentPrincipal.Identity
) 中公开的一样。
然后,在其构造函数中DbContext
接受您IIdentity
,并且每当上下文初始化时传递适当的IIdentity
(从您当前的上下文)。
例如(基于@qujck 的回答):
public class MyContext : DbContext
{
private readonly IIdentity _identity;
public DbContext(IIdentity identity)
{
this._identity = identity;
}
public override int SaveChanges()
{
//you may need this line depending on your exact configuration
//ChangeTracker.DetectChanges();
foreach (DbEntityEntry o in GetChangedEntries())
{
IEntity entity = o.Entity as IEntity;
entity.ModifiedBy = this._identity.Name;
}
return base.SaveChanges();
}
}
// Usage (ASP.NET):
var context = new DbContext(System.Web.HttpContext.Current.User.Identity);
IMO 最好的选择是在一个地方处理所有审计 - 您的工作单元 ( DbContext
)。这很容易通过让所有 Poco 对象实现一个公共接口(例如 IEntity)来实现。
这是一个例子:
public class MyContext : DbContext
{
public override int SaveChanges()
{
//you may need this line depending on your exact configuration
//ChangeTracker.DetectChanges();
foreach (DbEntityEntry o in GetChangedEntries())
{
IEntity entity = o.Entity as IEntity;
entity.ModifiedBy = HttpContext.Current.User.Identity.Name;
}
return base.SaveChanges();
}
private IEnumerable<DbEntityEntry> GetChangedEntries()
{
return new List<DbEntityEntry>(
from e in ChangeTracker.Entries()
where e.State != System.Data.EntityState.Unchanged
select e);
}
}