创建一个包含两个子表的主表,该子表与EF 4.1链接一对一或一

时间:2012-02-02 12:14:02

标签: c# entity-framework-4 shared-primary-key

使用MVC EF4.1,我试图将表(TableMaster)链接到TableChildOne(关系一对零或一)以及TableChildTwo(也是一对零或一)。 TableChildOne和TableChildTwo没有直接链接。

TablechildOne和TableChildTwo需要共享TableMaster的主键(我读过这个是不可能的,任何解决方法?)

我要包含一个图像以使其更清晰,不确定是否应该在某处添加外键,这不是代码创建的实际模型,而是我想要的。不确定某处是否应该有外键?

图片:http://www.davidsmit.za.net/img/untitled.png

下面的代码编译,但在尝试添加控制器时,我收到错误:

“已添加具有相同键的项目”

  public class TableMaster
{
    public int TableMasterID { get; set; }

    public DateTime ReportDate { get; set; }

    public virtual TableChildOne TableChildOne { get; set; }
    public virtual TableChildTwo TableChildTwo { get; set; }
}

public class TableChildOne
{
    [Key]
    public int TableMasterID { get; set; }

    public String Description_1 { get; set; }

    public virtual TableMaster TableMaster { get; set; }
}

  public class TableChildTwo
  {
     [Key]
      public int TableMasterID { get; set; }

     public String Description_2 { get; set; }

     public virtual TableMaster TableMaster { get; set; }
}

public class Context : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<TableMaster>()
            .HasOptional(p => p.TableChildOne).WithRequired(p => p.TableMaster);

        modelBuilder.Entity<TableMaster>()
            .HasOptional(p => p.TableChildTwo).WithRequired(p => p.TableMaster);

}

当我完全删除第二个表格时,它可以正常工作。

我使用以下链接作为示例(表OfficeAssignment和Student),它显示了如何将表一对一或一对一地链接。但我添加另一个具有相同链接的表时遇到问题: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net-mvc-application

任何帮助将不胜感激。

由于 appelmeester

1 个答案:

答案 0 :(得分:0)

你能否提供更多关于你为什么要这样做的背景?如果要跨三个表共享主键,则表示您正在对数据进行分区。您正在尝试解决哪些开发方案。听起来你可能想要映射对象继承,是吗?

如果你真的只有几个描述,那么这只是一个表。

修改

冷却。对于这个请求的业务环境有点模糊,我还是不太明白,抱歉。如果您有一个TableMaster,然后是一些子表,那么这听起来像一个继承树。因此,使用EF,您可以选择许多不同的策略来建模(TPH,TPT等)。为此,我建议调查TPT,因为这可能会让您获得清理数据的粒度。此外,默认情况下,您可以获得创建表的好处,就像您指定的那样。请查看this以供参考。