0

我正在努力实现以下最终结果。我的 Person 实体需要一个额外值的集合,并且这个值集合会因 Person 实例而异。我还有另一个 Contact 实体,它同样可以从实例到实例具有额外的值。

因此,我需要三个表,一个 Person、Contact 和一个 Extra,其中 Extra 为每个需要额外值的 Person 和 Contact 实例提供一组额外的值。通过为 Person 和 Contact 提供 GUID 字段,这意味着 GUID 值在两个表中都是唯一的,因此我可以将其用作要加入的字段。所以我希望定义看起来像这样......

Person
  Id - int - Primary Key
  Instance - GUID - Unique Constraint

Contact
  Id - int - Primary Key
  Instance - GUID - Unique Constraint

Extra
  Id - int - Primary Key
  Instance - GUID
  Value - string

但我无法将其建模到实体框架中。我希望我的 Person 和 Contact 实体有一个集合,每个集合都是与该实体相关的一组 Extra 值。我用上面指出的列集创建了三个表。

但是我无法让关联按预期工作,它总是希望根据 Person 和 Contact 实体的主键向数据库添加额外的列。任何想法如何真正让它发挥作用?或者这在 EF 中是不可能的?

4

3 回答 3

2

这对于 EF 是不可能的,因为它不支持唯一键。只有主键可以用作关系的主体。

于 2012-06-07T07:45:57.103 回答
1

正如已经回答的那样,EF 不支持唯一键。但是,如果您实际上不需要对该Id属性执行任何操作,则告诉 EF 这Instance是主键就足够了。EF 并不真正关心它是否是数据库级别的主键,它只需要知道它是否可以将其用作键本身。

编辑:实际上,那仍然行不通。除了不支持唯一键之外,您Extra.Instance不对应任何固定实体。为了使其正常工作,您需要将Extra表拆分为PersonExtraContactExtra表。无论如何,这可能是一个好主意,因为它允许您在数据库级别添加外键约束,这些约束与您希望在 EF 中看到的约束相对应。

于 2012-06-07T07:57:31.667 回答
0

执行此操作的 EF 方法是使用链接表 - 一个具有两列的简单表,在您的模型中直接不可见,但集合将可见。

例如

Person
  Id - int - Primary Key
  Instance - GUID - Unique Constraint

Contact
  Id - int - Primary Key
  Instance - GUID - Unique Constraint

Extra
  Id - int - Primary Key
  Instance - GUID
  Value - string

PersonExtra
  PersonId  - int
  ExtraId  - int

ContactExtra
  ContactId  - int
  ExtraId  - int

或者如果您的模型允许,将您的主键更改为 GUID。

于 2012-06-07T08:06:12.763 回答