我正在努力实现以下最终结果。我的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中无法实现?
答案 0 :(得分:2)
EF无法实现这一点,因为它不支持唯一键。只有主键可以用作关系中的主体。
答案 1 :(得分:1)
如前所述,EF不支持唯一键。但是,如果您实际上不需要对Id
属性执行任何操作,则告知EF Instance
是主键可能就足够了。 EF并不关心它是否是数据库级别的主键,它只需要知道它是否可以将其用作密钥本身。
编辑:实际上,这仍然无效。除了不支持唯一密钥外,您的Extra.Instance
与任何固定实体都不对应。为了使其正常工作,您需要将Extra
表拆分为PersonExtra
和ContactExtra
表。无论如何,这可能是一个好主意,因为它允许您在数据库级别添加与您希望在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。