Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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 复合主键,也是实体框架中的外键_Entity Framework - Fatal编程技术网

Entity framework 复合主键,也是实体框架中的外键

Entity framework 复合主键,也是实体框架中的外键,entity-framework,Entity Framework,如果我有两个表1,其中一个表1具有复合主键,其中一个键也是另一个表中的外键: 表1: A(PK,FK-映射到表2中的X) B(主键) C 表2: X(主键) Y 因为A既是表1中的PK,也是表2中的FK,所以当我使用EF生成实体模型时,表1中的A既有标量属性,也有导航属性。我似乎无法将A作为标量删除(我认为这是因为它是主键) 我遇到的问题是,如果创建Table1实体并将a的scalar属性设置为新值,a的导航属性将不会自动更改(反之亦然) 理想情况下,我只希望A公开navigation属

如果我有两个表1,其中一个表1具有复合主键,其中一个键也是另一个表中的外键:

表1:

  • A(PK,FK-映射到表2中的X)
  • B(主键)
  • C
表2:

  • X(主键)
  • Y
因为A既是表1中的PK,也是表2中的FK,所以当我使用EF生成实体模型时,表1中的A既有标量属性,也有导航属性。我似乎无法将A作为标量删除(我认为这是因为它是主键)

我遇到的问题是,如果创建Table1实体并将a的scalar属性设置为新值,a的导航属性将不会自动更改(反之亦然)


理想情况下,我只希望A公开navigation属性——如果A不是复合主键的一部分,它的行为方式就是这样。有没有办法做到这一点?

我假设表1源自表2,对吗?如果是,我会这样做:

(我还将两个表的PK更改为相同的名称,因为它们可能具有相同的含义——对于本例,我将使用示例ID)

  • 首先,使用默认关系创建模型(我通常只从数据库导入两个表)
  • 在设计器中,在基类型上单击鼠标右键,添加继承,然后选择派生类型
  • 删除一对零或一关联
  • 然后,因为基类型已经有列ID,所以将其从派生类型中删除
  • 转到派生类型的表映射,并将ID属性映射到表的ID

不要直接映射到表1,而是在数据库中添加一个包含表1所有字段的视图,以及一个(A2)的额外副本。 然后,将标量键映射到A2,将导航键映射到A

(如果使用视图,Visual Studio将无法找到主键;请手动编辑edmx文件的XML并将a添加到表a中,以解决此问题)


我知道-这是骇人和可怕的。。。但是,嘿,它起作用了

嗯,不是真的。使用schemabinding创建视图,并在视图上创建聚集索引(SQL Server 2008或更高版本,我不确定早期版本是否可以做到这一点)。聚集索引将被识别为主键,从而诱使EF(VS)相信视图是一个真实的表。

您是否设置了复合键的ID并在配置中引用了这些ID

i、 e

我想你需要一些类似的东西:

HasKey(pc => new { pc.AId, pc.BId});
HasRequired(x => x.A).WithMany().HasForeignKey(x => x.AId);

谢谢你的回复,迈克。实际上并没有继承关系,只是有一些表的主键在另一个表上形成了一个复合键。使用schemabinding创建视图,并在视图上创建聚集索引(SQL Server 2008或更高版本,我不确定早期版本是否可以做到这一点)。聚集索引将被识别为主键,从而诱使EF(VS)相信视图是真实的表。
HasKey(pc => new { pc.AId, pc.BId});
HasRequired(x => x.A).WithMany().HasForeignKey(x => x.AId);