如何在Entity Framework中使用具有相同外键的多个表

时间:2019-02-24 16:42:12

标签: c# entity-framework entity-framework-6

我需要定义我的3个类,如下所示:

public class Table1
{
   public Guid Table1CoreId {get;set;}
   public string Name {get;set;}

   public Table2 Table2 {get;set;}
   public Table3 Table3 {get;set;}
}

public class Table2
{
   Guid Table1CoreId {get;set;}
}

public class Table3
{
   Guid Table1CoreId {get;set;}
}

如您所见,我将Table2和Table3定义为Table1中的属性。

我尝试使用EF fluent API定义应如何创建它们,但没有得到想要的结果。我需要将表定义如下:

表1:

  • Table1CoreId(PK)
  • 名称

表2:

  • Table1CoreId(PK,FK)
  • 编号(PK)

表3:

  • Table1CoreId(PK,FK)
  • 编号(PK)

表2与表1具有1对1的关系,而表3与表1具有1对M的关系。 Table2和Table3中的两个条目都是可选的。

我尝试了以下操作:在我使用的Table2和3定义类中,我使用了以下内容:

this.HasRequired(t => t.Table1)
    .WithMany()
    .HasForeignKey(t => t.Table1CoreId)
    .WillCascadeOnDelete(false);

但是当我创建迁移并更新数据库时,它会在表1中创建其他列:

Table2_Table1CoreId
Table2_Id
Table3_Table1CoreId
Table3_Id

据我所知,所有主键和外键都是在各个表中创建的,但我只是不想在Table1中创建这些其他列。

我希望这是有道理的,并且有人可以为我指出正确的解决方法。

1 个答案:

答案 0 :(得分:0)

在与我的同事进一步讨论了这个问题之后,我们最终进一步标准化了我们的表,因此我们引入了另外一个表,并且还删除了一个表具有1-to-m关系的要求,因此所有表现在是1对1。所有这些更改使定义我们的类变得容易得多,也使解决我们的EF问题变得容易得多。

最终更改如下:

public class Table1
{
    public Guid Table1CoreId {get;set;}
    public string Name {get;set;}
}

public class Table2
{
   Guid Table1CoreId {get;set;}
   int  Table2CoreId {get;set;}
}

public class Table3
{
   Guid Table2CoreId {get;set;}
}

public class Table4
{
   Guid Table2CoreId {get;set;}
}

在Table2配置类中,添加了以下内容:

public class Table2Configuration : EntityTypeConfiguration<Table2>
{
    ...
    this.HasOptional(t => t.Table3)
        .WithRequired(o => o.Table2)
        .WillCascadeOnDelete(true);

    this.HasOptional(t => t.Table4)
        .WithRequired(o => o.Table2)
        .WillCascadeOnDelete(true);
}

我们的表现在看起来像这样:

表1:

  • Table1CoreId(PK)
  • 名称

表2:

  • Table1CoreId(PK,FK)
  • Table2CoreId

表3:

  • Table2CoreId(PK,FK)
  • 编号(PK)

表4:

  • Table2CoreId(PK,FK)
  • 编号(PK)

并且按照最初的要求,表1中没有添加其他字段。

注意:基于我的原始问题,我确实通过将[ForeignKey(“ Table1CoreId,Id”)]属性添加到两个导航属性(即Table2和Table3)中,设法解决了其他字段问题)定义在表1中,但由于我们最终重新设计了类和表,因此从未使用EF Fluent API对其进行解决。