1

Commentエンティティ/テーブルに加えられたすべての変更の履歴を保存したいと考えています。

私のアプローチ:
- 「挿入のみ」のテーブル
を使用する - db で生成された int キーと db で生成された DateTime スタンプで構成される複合 PKを使用する -エンティティで AsNoTracking
を 使用する

しかし、それがこのエンティティのナビゲーション プロパティであるとします。

public Article { 
  public int ID { get; set; }
  public string Title { get; set; }
  public string Content { get; set; }
  public virtual Comment Comments { get; set; }
}

したがって、呼び出すと、すべてのリビジョンを意味するすべてのarticleFoo.Commentsエンティティが取得されます。「最新」のものだけを取得したい。どうすればこれを達成できますか?

- -アップデート - -

  1. Linq フィルタリングを使用する場合はどう
    すればよいでしょうか。また、sprocs オプションを使用する場合はどのようにすればよいでしょうか。
  2. 私の仮定は不完全です。複合キーを生成する必要があります。これは、2 つのリビジョン エンティティの ID は同じである必要がありますが、更新された日時が異なる必要があるためです。したがって、データベースにそれらを自動的に生成させることはできませんか?
4

1 に答える 1

0

のシャドウまたは監査テーブルを作成することにより、Dbのみのルートに進むことができますComments。これにより、テーブルトリガーを使用して、フィールドレベルですべての挿入、変更、および削除が追跡されます。私はそれを簡単にするためのツールを探しました、そして私はここのCodeProjectでそれを見つけました-しかし、もっと長く検索すればもっと良いものを見つけることができます。

これがあなたのボートを浮かせないなら...

EFを使用すると、コミットする前に新しい、更新された、または削除されたコメントレコードを確認し、コミットする前に履歴情報を追加できます。

を使用するObjectContext.SavingChangesと、たとえば、変更を確認して記録し、独自の履歴レコードをコンテキストに追加できます。

私の例では、私のDbContextインスタンスは、基になるイベントStackOverflowEntitiesにイベントハンドラーを追加した場所ですObjectContext.SaveChanges

    // SavingChanges event handler. 
    private void context_SavingChanges(object sender, EventArgs e) {

        ObjectContext objectContext = sender as ObjectContext;

        if (objectContext != null) {
            foreach (ObjectStateEntry entry in objectContext.ObjectStateManager
                            .GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted)
                            .Where(et => et.Entity.GetType().Equals(typeof(Comment)))) {

                Comment comment = entry.Entity as Comment;
                Comment_Audit audit = new Comment_Audit {
                    BodyText = comment.BodyText,
                    Commentor = comment.Commentor,
                    ..
                    ..
                    ChangedAt = DateTime.Now,
                    ChangeType = entry.State.ToString()

                };

                StackOverflowEntities.Set<Comment_Audit>().Add(audit);

            }
        }
    }

これで、aが変更されるたびに、Comment一緒に保存する監査レコードを追加します。

于 2013-01-19T16:01:08.363 に答える