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 回答