【问题标题】:4-eyes-principal implementation on a contact & company system [closed]联系人和公司系统上的 4-eyes-principal 实施 [关闭]
【发布时间】: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


【解决方案1】:

想法 2 更好。除了您需要对待处理的更改进行一些验证。因此,无论何时修改实体,您都需要首先验证。如果该实体存在一些待处理的更改,那么它现在将取决于最终用户来解决冲突,他可能会选择覆盖旧的未决更改。最终它将覆盖未决更改,这些更改以 XML 的形式存储。 或者您可能不会重写旧版本,并且可以有两个版本的挂起更改,然后它将取决于业务用户最终确定哪个更好。因此在这种情况下,您可以以 XML 的形式进行挂起更改,例如:

 <pendingChanges entityID="12333">
     <propertyName1>
      <version1 value="val1"/>
      <version2 value="val2"/>
    </propertyName1>
    <propertyName2>
     <version1 value="val1"/>
     <version2 value="val2"/>
     <version2 value="val3"/>
    </propertyName2>
  </pendingChanges>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2021-09-20
    • 2012-04-09
    • 2011-07-31
    • 2013-02-05
    相关资源
    最近更新 更多