当我的数据库中的记录得到更新时,我需要能够保存编辑它的人。
目前在我的存储库中我这样做
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);
    }
}