2

コード ファースト アプローチを使用して、MVC .NET アプリケーションの一部のデータベース オブジェクトの変更履歴を追跡する必要があります。

履歴テーブルの意味は次のとおりです。 http://database-programmer.blogspot.de/2008/07/history-tables.html

自分で SQL クエリを作成する場合は、履歴テーブルを使用します。しかし、コードファーストアプローチではSQLが生成されます...そして私はこのパラダイムに固執したいと思います.

目標は、変更/削除されたエントリのすべての「古い」リビジョンを、いくつかの追加情報 (タイムスタンプ、変更したユーザーなど) とともに保持する構造です。

何か案は?

よろしく、ステファン

より具体的には、コード例を次に示します。

public class Node {
 public int NodeID { get; set; }

 public string? data { get; set; }  // sample data
}


public class NodeHistory {
  public int NodeID { get; set; }
  public string? data { get; set; }

  public int UserID { get; set; }
  public DataTime timestamp { get; set; }
}

私が必要としているのは、ノード構造をテーブル化するために変更が永続化されるたびに、NodeHistory にエントリを追加できるようにするための「フレームワーク」支援です。

つまり、「ノード」への変更が最後に保持されない場合 (ロールバックなど)、エントリも作成されるため、set-method をオーバーライドするだけでは解決策にはなりません。

4

2 に答える 2

2

私にとって最善のアプローチは、リポジトリ パターンを使用し、履歴を保持するのに適していると思われる Node オブジェクトに対するすべての操作で NodeHistory テーブルに挿入することだと思います。

編集:いくつかのコード

public class NodeRepository{
    public Node EditNode(Node toEdit, int userId){
        using(new TransactionScope())
        {            
            //Edit Node in NodeContext like you would anyway without repository
            NodeContext.NodeHistories.Add(new NodeHistory(){//initialise NodeHistory stuff here)
            NodeContext.SaveChagnes();
        }
    }
}
public class NodeContext:DbContext{
    public DbSet<Node> Nodes{get;set;}
    public DbSet<NodeHistory> NodeHistories{get;set;}
}

これよりも単純なものを探している場合、それが何であるかはわかりません。

于 2012-09-06T13:03:18.777 に答える
1

これは本当にトリガーで行うべきことです。はい、SQLを作成する必要がありますが、手動またはその他の方法で更新がどのように行われたかに関係なく、履歴が更新されます。

于 2012-09-06T20:47:43.880 に答える