「監査」フィールドと同じレイアウトを使用しています。
私がこれを解決したのは、AuditableEntity
という名前の基本抽象クラスを作成してプロパティを保持し、PrepareSave
というメソッドを公開することでした。必要に応じてPrepareSave
内部Iは、フィールドの値を設定します。
public abstract class AuditableEntity
{
public DateTime CreatedDate { get; set; }
public string CreatedBy { get; set; }
public DateTime UpdatedDate { get; set; }
public string UpdatedBy { get; set; }
public virtual void PrepareSave(EntityState state)
{
var identityName = Thread.CurrentPrincipal.Identity.Name;
var now = DateTime.UtcNow;
if (state == EntityState.Added)
{
CreatedBy = identityName ?? "unknown";
CreatedDate = now;
}
UpdatedBy = identityName ?? "unknown";
UpdatedDate = now;
}
}
は私がしたい場合ので、私は私のエンティティでそれをオーバーライドすることができ
PrepareSave
仮想をしました。実装に応じてIDを取得する方法を変更する必要があるかもしれません。
は、これを呼び出すには、私は私のDbContext
にSaveChanges
を上書きして(私は変更トラッカから得た)追加または更新されていた各エンティティにPrepareSave
と呼ば:今すぐ
public override int SaveChanges()
{
// get entries that are being Added or Updated
var modifiedEntries = ChangeTracker.Entries()
.Where(x => x.State == EntityState.Added || x.State == EntityState.Modified);
foreach (var entry in modifiedEntries)
{
// try and convert to an Auditable Entity
var entity = entry.Entity as AuditableEntity;
// call PrepareSave on the entity, telling it the state it is in
entity?.PrepareSave(entry.State);
}
var result = base.SaveChanges();
return result;
}
、私は上SaveChanges
を呼び出すたび私のDbContext(直接またはリポジトリを介して)、AuditableEntity
を継承するすべてのエンティティは、必要に応じて監査フィールドを設定します。
私はこれの考えが好きです。 1つの問題は、異なるタイプの複数のdbcontextを維持していない限り、監査可能でないエンティティ、またはセーブ設定の異なる種類のエンティティを持つ場合、この方法は機能しません。 – Steve
@Steve: 'ChangeTracker.Entries().TypeOf()'は既に監査対象のエンティティをフィルタリングします。しかし、それをさらにモジュール化したい場合は、戦略パターンを使用して、複数の 'IEntitySaveHandler'または' IEntitySaveHandler'sに分割してから、 'CanHandle'メソッドと' Handle'メソッドをメソッドに渡す必要があります。次に、各ハンドラはエンティティに適用できるかどうかを確認し、エンティティに適用できるかどうかを確認し、変更されている場合は変更を行います。このアプローチは、開かれた/閉じられた原則(拡張のために開いて、変更のために開かれている)を尊重し、ベースのDbContextを変更せずに新しいハンドラを追加することもできます –
Tseng
しかし、これは単一の質問の範囲外です。 – Tseng