1

当我的数据库中的记录得到更新时,我需要能够保存编辑它的人。

目前在我的存储库中我这样做

pt.ModifiedBy = HttpContext.Current.User.Identity.Name;

必须有更好的方法来做到这一点,还是这是唯一的方法?

4

2 回答 2

6

通过使用HttpContext.Current.User,您将与您紧密耦合DbContextHttpContext这不是一个好主意,以防您将您暴露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);
于 2013-06-03T10:43:53.773 回答
3

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);
    }
}
于 2013-06-03T09:06:28.793 回答