创建一个包含两个子表的主表,其中一个子表链接到零或一个子表与EF 4.1

本文关键字:一个 EF 包含两 创建 链接 | 更新日期: 2023-09-27 18:22:19

使用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),它展示了如何将表1链接到零或1。但是,我很难添加另一个具有相同链接的表:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net-mvc-application

任何帮助都将不胜感激。

谢谢appelmester

创建一个包含两个子表的主表,其中一个子表链接到零或一个子表与EF 4.1

您能提供更多关于为什么要这样做的背景信息吗?如果您在三个表之间共享主键,那么您就是在对数据进行分区。您试图解决的开发场景是什么。听起来你可能想要映射一个对象继承,对吗?

如果您真的只有几个描述,那么这实际上只是一个表。

编辑:

酷。因为这个请求的业务上下文有点模糊,我仍然不能完全理解,对不起。如果您有一个TableMaster和一些子表,那么这听起来像是一个继承树。因此,使用EF,您可以选择许多不同的策略来对此进行建模(TPH、TPT等)。为此,我建议研究TPT,因为这可能会让您获得想要如何清理数据的粒度。此外,您还可以获得这样的好处,即在默认情况下,将在很大程度上像您指定的那样创建表。请查看以供参考。