复合主键,也是Entity Framework中的外键

时间:2009-03-13 22:22:59

标签: entity-framework

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

表1:

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

表2:

  • X(PK)
  • ý

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

我遇到的问题是,如果我创建一个table1Entity并将A的标量属性设置为新值,则A的导航属性不会自动更改(反之亦然)。

理想情况下,我只想要A来公开导航属性 - 如果A也不是复合主键的一部分,它就是它的行为方式。有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:1)

假设Table1派生自Table2,我是否正确?如果是这样,我会这样做:

(我也将两个表的PK改为同名,因为它们可能具有相同的含义 - 对于这个例子,我将使用示例ID)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

(您将遇到一个问题,如果您使用视图,Visual Studio找不到主键;请通过手动编辑edmx文件的XML并添加< Key>< PropertyRef来解决此问题。 .. />< / Key>到表A的< EntityType>

我知道 - 这很丑陋而且可怕......但是嘿 - 它有效!