实体框架在修改记录时保存用户

Mik*_*iaz 1 asp.net entity-framework

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

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

pt.ModifiedBy = HttpContext.Current.User.Identity.Name;
Run Code Online (Sandbox Code Playgroud)

必须有更好的方法来做这个或这是唯一的方法吗?

hai*_*770 5

通过使用HttpContext.Current.User你紧紧地捆绑在一起你DbContextHttpContext这不是在情况下,你会暴露你一个好主意,DbContext到非网络环境(单元测试,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);
Run Code Online (Sandbox Code Playgroud)