Entity framework 无法获取实体框架以处理GUID关系
我正在努力实现以下最终结果。我的Person实体需要一组额外的值,并且这些值的集合因Person实例而异。我还有另一个联系人实体,它同样可以从一个实例到另一个实例具有额外的值 因此,我需要三个表,一个Person,Contact和一个Extra,其中Extra为需要额外值的每个Person和Contact实例提供了一组额外值。通过给Person和Contact一个GUID字段,这意味着GUID值在两个表中都是唯一的,因此我可以将其用作连接的字段。所以我希望定义是这样的Entity framework 无法获取实体框架以处理GUID关系,entity-framework,Entity Framework,我正在努力实现以下最终结果。我的Person实体需要一组额外的值,并且这些值的集合因Person实例而异。我还有另一个联系人实体,它同样可以从一个实例到另一个实例具有额外的值 因此,我需要三个表,一个Person,Contact和一个Extra,其中Extra为需要额外值的每个Person和Contact实例提供了一组额外值。通过给Person和Contact一个GUID字段,这意味着GUID值在两个表中都是唯一的,因此我可以将其用作连接的字段。所以我希望定义是这样的 Person Id -
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实体的主键向数据库添加额外的列。有没有办法让它真正起作用?或者这在EF中是不可能的?这在EF中是不可能的,因为它不支持唯一键。只有主键可以用作关系的主体。这在EF中是不可能的,因为它不支持唯一键。只有主键可以用作关系的主体。如前所述,EF不支持唯一键。但是,如果您实际上不需要对
Id
属性执行任何操作,那么告诉EFInstance
是主键就足够了。EF并不真正关心它是否是数据库级别的主键,它只需要知道它本身是否可以将其用作键
编辑:事实上,那还是不行的。除了不支持唯一键之外,您的
Extra.Instance
也不对应于任何固定实体。为了使其工作,您需要将Extra
表拆分为PersonExtra
和ContactExtra
表。无论如何,这可能是一个好主意,因为它允许您在数据库级别添加外键约束,这些约束与您希望在EF中看到的约束相对应。如前所述,EF不支持唯一键。但是,如果您实际上不需要对Id
属性执行任何操作,那么告诉EFInstance
是主键就足够了。EF并不真正关心它是否是数据库级别的主键,它只需要知道它本身是否可以将其用作键
编辑:事实上,那还是不行的。除了不支持唯一键之外,您的
Extra.Instance
也不对应于任何固定实体。为了使其工作,您需要将Extra
表拆分为PersonExtra
和ContactExtra
表。不管怎样,这可能是一个好主意,因为它允许您在数据库级别添加外键约束,这些约束对应于您希望在EF中看到的约束。EF实现这一点的方法是使用链接表—一个简单的表,它有两列,在您的模型中不直接可见,但集合将是可见的
e、 g
或者,如果您的模型允许,可以将主键更改为GUID。执行此操作的有效方法是使用链接表—一个包含两列的简单表,它在您的模型中不直接可见,但集合将显示 e、 g
或者,如果您的型号允许,请将主键更改为GUID。EF不支持此操作。但是nHibernate.EF不支持这一点。但是尼伯内特有,谢谢。我想我可以使用实例作为主键,但我担心使用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
PersonExtra
PersonId - int
ExtraId - int
ContactExtra
ContactId - int
ExtraId - int