Entity framework 复合主键,也是实体框架中的外键
如果我有两个表1,其中一个表1具有复合主键,其中一个键也是另一个表中的外键: 表1: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属
- A(PK,FK-映射到表2中的X)
- B(主键)
- C
- X(主键)
- Y
理想情况下,我只希望A公开navigation属性——如果A不是复合主键的一部分,它的行为方式就是这样。有没有办法做到这一点?我假设表1源自表2,对吗?如果是,我会这样做: (我还将两个表的PK更改为相同的名称,因为它们可能具有相同的含义——对于本例,我将使用示例ID)
- 首先,使用默认关系创建模型(我通常只从数据库导入两个表)
- 在设计器中,在基类型上单击鼠标右键,添加继承,然后选择派生类型
- 删除一对零或一关联
- 然后,因为基类型已经有列ID,所以将其从派生类型中删除
- 转到派生类型的表映射,并将ID属性映射到表的ID
我知道-这是骇人和可怕的。。。但是,嘿,它起作用了 嗯,不是真的。使用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);