1

データベースでレコードが更新されたら、誰が編集したかを保存できる必要があります。

現在、私のリポジトリでこれを行っています

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

これを行うためのより良い方法が必要ですか、それともこれが唯一の方法ですか?

4

2 に答える 2

6

を使用HttpContext.Current.Userすることで、Web 以外の環境 (UnitTesting、WCF、WPF など) に公開する場合に備えて、これはお勧めできませんDbContextHttpContextDbContext

ASP.NET ( )、WCF ( )、Thread ( ) でSystem.Security.Principal.IIdentity公開されているのと同じように、代わりに使用できます。System.Web.HttpContext.Current.User.IdentitySystem.ServiceModel.OperationContext.Current.ServiceSecurityContext.PrimaryIdentityThread.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 の最良のオプションは、すべての監査を 1 か所 (作業単位) で処理することです ( 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 に答える