Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 无法获取实体框架以处理GUID关系_Entity Framework - Fatal编程技术网

Entity framework 无法获取实体框架以处理GUID关系

Entity framework 无法获取实体框架以处理GUID关系,entity-framework,Entity Framework,我正在努力实现以下最终结果。我的Person实体需要一组额外的值,并且这些值的集合因Person实例而异。我还有另一个联系人实体,它同样可以从一个实例到另一个实例具有额外的值 因此,我需要三个表,一个Person,Contact和一个Extra,其中Extra为需要额外值的每个Person和Contact实例提供了一组额外值。通过给Person和Contact一个GUID字段,这意味着GUID值在两个表中都是唯一的,因此我可以将其用作连接的字段。所以我希望定义是这样的 Person Id -

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

因此,我需要三个表,一个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实体的主键向数据库添加额外的列。有没有办法让它真正起作用?或者这在EF中是不可能的?

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

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

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


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

如前所述,EF不支持唯一键。但是,如果您实际上不需要对
Id
属性执行任何操作,那么告诉EF
Instance
是主键就足够了。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