これを行うには 2 つのオプションがありますが、どちらも基本型を導入するか、すべてのエンティティをジェネリック関数でカバーするためのインターフェイスを導入する必要があります。各エンティティは何度も何度も実装する必要がありますが、私はインターフェイスを好みます。
あなたが作成するとしましょう
interface IAuditable
{
DateTime Modified { get; set; }
string ModifiedBy {get; set; } // User id?
}
これで、次のことができます。
public virtual void Insert(TEntity entity)
where TEntity : IAuditable
{
entity.Modified = DateTime.Now;
entity.ModifiedBy = ???? // Whatever you get the name from
...
}
(編集も同様)
コンテキストのSavingChanges
イベントをサブスクライブすることもできます。
// In the constructor:
context.SavingChanges += this.context_SavingChanges;
private void context_SavingChanges(object sender, EventArgs e)
{
foreach (var auditable in context.ObjectStateManager
.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
.Select(entry => entry.Entity)
.OfType<IAuditable>)
{
auditable.Modified = DateTime.Now;
auditable.ModifiedBy = ????;
}
}
一緒に仕事をすればDbContext
、
((IObjectContextAdapter)this).ObjectContext.SavingChanges
データベース トリガーを使用することで、より信頼性の高い時間追跡を実現できる (そしてそうすべきかもしれない) ことを付け加えたいと思います。今、あなたはクライアントの時計に依存しています。