【发布时间】:2012-02-25 19:49:43
【问题描述】:
要求
我们正在构建一个相当复杂的系统,我们需要在其中管理联系人和公司(实体)。 实体由业务用户管理。他们有多个关联。例如:
联系方式
- ID=42, FirstName=John,LastName=Doe
公司
- ID=111,名称=公司 1
- ID=222,名称=公司 2
- ID=333,名称=公司 3
地址
- ID=456,城市=纽约,街道=百老汇,类型=邮政
- ID=789, City=Berlin,Street=Meier Strasse,Type=Residential
联系公司协会
- ContactID=42,CompanyID=111
- ContactID=42,CompanyID=222
联系地址关联
- ContactID=42,AddressID=789
- ContactID=42,AddressID=456
因此 ID=42 的联系人与 2 家公司相关联。还有更多的关联:所以一个联系人可以有多个电话号码、邮政地址等等......
实体有 3 个状态:
1. InCreation 实体已创建,但仍缺少一些必填字段;还没准备好使用。
2。 Pending 实体已完全创建,所有必填字段均已填写;还没准备好使用
3.已验证 实体已验证(由用户!= 创建者)并且可以使用
一旦实体达到验证状态并且想要修改这样的验证实体,修改必须单独存储并且不允许修改验证实体。因此,经过验证的实体仍然是系统其余部分使用的实体。 稍后,业务用户 != 修饰符能够验证这些更改:通过比较已更改的所有内容。如果他接受这些更改,则需要将更改应用于原始验证实体。 Apply 表示需要将值复制到原始数据库记录中,因为不允许更改 ID(它们指向其他实体系统)
问题
我如何存储这些修改?
想法 1
修改只是具有新状态的另一条记录=InModification。但是我还需要将所有关联加倍,并且需要存储原始实体和关联之间的关系,因为我以后需要知道发生了什么变化(例如,纽约的邮政地址现在在第 5 街,现在在百老汇更长) 这将创建很多可能不需要的记录,因为实体关联树可能很大,并且必须创建很多记录来修复名称中的拼写
想法 2
将修改存储为 XML blob(我们使用 WCF 将实体从服务器传输到客户端,因此这些实体默认是可序列化的)。这不会触及 ID 以及稍后应用更改时(必须特别注意删除和添加的关联)。我在这里看到的问题是软件更新。一旦我们在以后的更新中更改了实体结构,就会存在保存在 2 个版本之间的旧实体修改不再可读的危险
【问题讨论】:
-
我认为您应该研究事件溯源和 cqrs,它似乎非常适合管理您在这里的复杂性类型。
标签: c# entity-framework-4