我已经看过一些审计挂钩,具体框架。他们中许多人显示老或新的价值的比较。这么伟大的审计跟踪,但我找到快照对象。

例如...让我们说有一个应用程序,用于管理产品。一个产品具有多种属性和关联的其他对象。我们是说我改变的一个目10倍。我们还要说,重要的是,我可以看屏幕的那些对象的变化(未审计线索但是什么屏幕上实际上看起来像在一个只读格式)。什么我感兴趣的是能够检索的原始EF产品对象(与所有相关的数据)对所有10个这些修改(取决于它我要看)和使用,以结合到我的屏幕。

如果我使用SQL服务器,什么类型的我应该使用的化对象如今(XML,blob,等等)?这会让感到这么做吗?

有帮助吗?

解决方案

让我们来看看。你有一个要求采取的对象图,并将其序列进入,这将让你兑现它后面的格式数据库。我认为有哪些做的正是这样的工具。其中之一,它给我的印象,是实体框架。

什么你想要做的是很平常的事。考虑一个wiki引擎。维基需要有一个最新修订,每个人都看到了,再加上每一个文件的背面修订。维基还需要能够在刚刚同样的方式,一个最新修订显示显示修订回来。因此,相同的存储格式应该被用于它们两者。

我建议你让所有的实体类型来进行版本控制。当您编辑的实体类型,您将编辑最新修订并存储包含前值回版本。 (编辑而不是插入新的末端最新修订的原因是因为其他的对象,目前没有物化到ObjectContext的,可以包含指向尖端你想保存的链接给小费,而不是链接背面修正。)

如果有必要,可以使背部修改存储在不同的文件组划分您的SQL Server表。这将允许您备份尖端的修订和修订背面分别

其他提示

首先,你需要添加一个设定的属性向你表:

  • 版本时的最后一次修改(也可以自增计数,而不是时间)。
  • LastModifiedBy参考用户作最后修改(如果存储)。

然后你有几种选择,关于如何储存的版本的历史。你可以

  1. 创建一个新表格为每一个主要的桌子你想要保存的历史。历史表将会有所有相同的领域为主表,但初级和外键不会被强制执行。对于每一个外国的关键还储存的版本引入的时候版本的创建。

  2. 或者你可以化一切有趣的对你的实体和储存所有化blob所有实体要版本在一个全球历史表(我个人比较喜欢第一个方法)。

你如何填写你的历史表?通过更新、删除的触发器。

  • 在更新触发对你的实体的副本以前的所有价值观的历史表。对于每一个外国的关键-亦复制目前的版本引用的实体。
  • 在删除触发基本上这样做。

注意到更多和更现代的系统真的不删除任何东西。他们只是 标记 事情为已删除。如果你想要遵循这一模式(其中有几个好处),而不是删除添加在被删除的标志你的实体(当然然后您可以过滤实体删除了到处).

你怎么看你的历史?只是使用的历史表,由于具有相同性质作为主要表不应该是一个问题。但是,在扩展外键-确保被引用的实体版本是一样的因为你存在你的历史表。如果这不是-你需要去历史表的,被引用的实体和抢值。这样,你总是会有的快照如何实体看起来像在那一刻,包括所有参考文献。

除了上述所有-你也可以恢复国家的实体以任何先前的版本。

注意,这实施,同时容易,可消耗一定的空间,因为它存储的 快照, 不只是改变正在取得进展。如果你想要的只是储存的变化-更新触发你可以检测是什么领域已经改变,化它们而存在的全球历史表。这样你至少可以显示在用户界已经改变以及由谁(虽然你可能会有麻烦恢复到以前的一些版本)。

在一个项目,我最近建立我们使用我们插入 SaveChanges 方法在 DbContext 类。这给了我们访问的一个实例 ChangeTracker 类。叫 ChangeTracker.Entries() 给你访问的名单 DbEntityEntry. DbEntityEntry 具有以下有趣的性质和方法:

  • State -是的对象的新建、修改或被删除
  • Entity -一个复制的对象,因为它代表
  • CurrentValues -枚举的编辑价值
  • OriginalValues -枚举的原始价值

我们创造了一套POCOs为改变集和变化,然后,我们可以通过EF。这允许用户查外地一级的改变沿用日期和负责任的用户。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top