.NET MVC代码中的历史表第一种方法?

时间:2012-09-06 12:44:46

标签: c# asp.net-mvc database ef-code-first

我需要使用代码优先方法跟踪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不是一个解决方案,因为如果对“Node”的更改在最后没有保留(例如roleback),它也会创建一个条目。

2 个答案:

答案 0 :(得分: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;}
}

如果你正在寻找比这更简单的东西,那么我不知道它可能是什么。

答案 1 :(得分:1)

这是你应该用触发器做的事情。是的,您必须为它编写一些sql,但无论更新如何发生,都可以手动或通过其他方式更新历史记录。