我需要使用代码优先方法跟踪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),它也会创建一个条目。
答案 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,但无论更新如何发生,都可以手动或通过其他方式更新历史记录。