【问题标题】:Composite primary keys which are also foreign keys in Entity Framework复合主键也是实体框架中的外键
【发布时间】:2009-03-13 22:22:58
【问题描述】:

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

表一:

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

表 2:

  • X(PK)

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

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

理想情况下,我只想让 A 公开导航属性——如果 A 不是复合主键的一部分,这就是它的行为方式。有什么方法可以实现吗?

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢迈克的回复。其实并没有继承关系,只是有几张表,主键在另外一张表上形成复合键。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      public class Table1
      {
      public Table2 A{get;set}
      public int AId {get;set;}
      
      public int BId {get;set;}
      }
      

      我假设你需要类似的东西:

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

      【讨论】:

        【解决方案4】:

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

        (如果使用视图,您会遇到问题,Visual Studio 找不到主键;通过手动编辑 edmx 文件的 XML 并添加 到表 A) 的

        我知道 - 这很骇人听闻......但是嘿 - 它有效!

        【讨论】:

        • 嗯,不是真的。使用模式绑定创建视图并在视图上创建聚集索引(SQL Server 2008 或更高版本,我不确定是否可以这样做的早期版本)。聚集索引将被识别为主键,从而诱使 EF(VS) 相信视图是一个真实的表。
        猜你喜欢
        • 1970-01-01
        • 2011-07-20
        • 2016-06-08
        • 1970-01-01
        • 2022-11-21
        • 2013-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多