データベースでレコードが更新されたら、誰が編集したかを保存できる必要があります。
現在、私のリポジトリでこれを行っています
pt.ModifiedBy = HttpContext.Current.User.Identity.Name;
これを行うためのより良い方法が必要ですか、それともこれが唯一の方法ですか?
データベースでレコードが更新されたら、誰が編集したかを保存できる必要があります。
現在、私のリポジトリでこれを行っています
pt.ModifiedBy = HttpContext.Current.User.Identity.Name;
これを行うためのより良い方法が必要ですか、それともこれが唯一の方法ですか?
を使用HttpContext.Current.User
することで、Web 以外の環境 (UnitTesting、WCF、WPF など) に公開する場合に備えて、これはお勧めできませんDbContext
。HttpContext
DbContext
ASP.NET ( )、WCF ( )、Thread ( ) でSystem.Security.Principal.IIdentity
公開されているのと同じように、代わりに使用できます。System.Web.HttpContext.Current.User.Identity
System.ServiceModel.OperationContext.Current.ServiceSecurityContext.PrimaryIdentity
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 の最良のオプションは、すべての監査を 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);
}
}