![]() |
1
11
让我们看看。您需要获取一个对象图并将其序列化到数据库中,其格式允许您稍后实现它。我认为有一些工具可以做到这一点。其中一个让我印象深刻的是实体框架。 你想做的是一件很平常的事。考虑一个wiki引擎。wiki需要有一个每个人都能看到的提示修订,加上每个文档的向后修订。wiki还需要能够以显示提示修订的相同方式显示后修订。因此,两种存储格式都应该使用相同的存储格式。 我建议您允许对所有实体类型进行版本控制。编辑实体类型时,将编辑提示修订并存储包含以前值的后修订。(编辑提示修订而不是插入新提示的原因是,当前未具体化到对象上下文中的其他对象可能包含指向提示的链接,您希望保留这些链接作为指向提示的链接,而不是指向后修订的链接。) 如果需要,可以对SQL Server表进行分区,以便将后修订存储在不同的文件组中。这将允许您分别备份提示修订和备份修订。 |
![]() |
2
4
首先,需要向表中添加一组属性:
然后,您有几个关于如何存储版本历史记录的选项。你可以
如何填写历史记录表?通过更新和删除触发器。
请注意,越来越多的现代系统并没有真正删除任何内容。他们只是 作记号 删除的内容。如果您想遵循这个模式(它有几个好处),那么不要删除,而是向您的实体添加isDeleted标志(当然,您必须在任何地方筛选已删除的实体)。 你如何看待你的历史?只需使用历史记录表,因为它具有与主表相同的所有属性—不应该是问题。但是,在扩展外键时,请确保引用的实体版本与存储在历史记录表中的版本相同。如果不是,您需要转到该引用实体的历史表并在那里获取值。通过这种方式,您将始终获得实体在当时的外观快照,包括所有引用。 除了上述所有内容之外,您还可以将实体的状态恢复到任何以前的版本。 请注意,此实现虽然简单,但可能会占用一些空间,因为它存储 快照 ,不仅正在进行更改。如果只想在更新触发器中存储更改,可以检测哪些字段已更改,将其序列化并存储在全局历史记录表中。这样,您至少可以在用户界面中显示已更改的内容以及由谁更改的内容(尽管您可能无法恢复到某些以前的版本)。 |
![]() |
3
3
在我最近创建的一个项目中,我们使用了
我们为变更集和变更创建了一组POCO,然后可以通过EF访问这些变更。这允许我们的用户查看字段级别的更改以及日期和负责的用户。 |
![]() |
Drago · Linq通过比较Id和具有Id的对象列表来查询获取列表 3 年前 |
![]() |
Niyazi Babayev · 如何在表达式中动态应用表达式? 3 年前 |
![]() |
Murat Güzel · EF存储库模式错误{'Id'}已被跟踪 3 年前 |
![]() |
dotnetdevcsharp · 减少基于数据类型获取设置的方法数量 3 年前 |
![]() |
saravanan049 · 在实体框架中回滚Azure SQL数据库 3 年前 |