0

私はEF 5.0とモデルファーストアプローチを使用しています。基本的なget、insert、deleteなどのステートメントを持つGenericRepositoryを構築しました。お気に入り:

public virtual void Insert(TEntity entity)
{
      dbSet.Add(entity);
}

私の EF エンティティはすべて属性 Modified と ModifiedBy を持っています。エンティティを保存するたびに、この値を変更したいと考えています。特定の実装を常に記述せずに、この 2 つの属性を変更する (値を設定する) ことは可能ですか?

ありがとうございました

4

2 に答える 2

2

これを行うには 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

データベース トリガーを使用することで、より信頼性の高い時間追跡を実現できる (そしてそうすべきかもしれない) ことを付け加えたいと思います。今、あなたはクライアントの時計に依存しています。

于 2013-02-02T22:18:02.317 に答える