无法获取实体框架来处理GUID关系

时间:2012-06-07 05:45:08

标签: entity-framework

我正在努力实现以下最终结果。我的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中无法实现?

3 个答案:

答案 0 :(得分:2)

EF无法实现这一点,因为它不支持唯一键。只有主键可以用作关系中的主体。

答案 1 :(得分:1)

如前所述,EF不支持唯一键。但是,如果您实际上不需要对Id属性执行任何操作,则告知EF Instance是主键可能就足够了。 EF并不关心它是否是数据库级别的主键,它只需要知道它是否可以将其用作密钥本身。

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

答案 2 :(得分:0)

这样做的方法是使用链接表 - 一个包含两列的简单表,这些列在模型中不会直接显示,但是集合将是。

e.g。

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。