如何使用流畅的api与多个表和三个外国人键?

时间:2017-02-09 11:32:14

标签: c# entity-framework-6 ef-fluent-api

我有这些表格:

  • 表A(IdA,---)
  • 表B(IdB,---)
  • TableC(IdC,---)
  • TableABC(IdFkA,IdFkB,IdFkC)

另外,我有4个POCO对象:

TableA
{
    IDTableA;
}

TableB
{
    IDTableB;
}

TableC
{
    IDTableC;
}

TableABC
{
    IDTableA;
    IDTableB;
    IDTableC;
}

注意:我知道我没有显示导航属性,但它只是说我也有实现表的POCO实体,这不像我只有两个表的多对多关系

TableABC具有三列IdFkA,IdFkB,IdFkC作为关键字。我想知道如何使用EF6和流畅的API来映射它。

我在想这样的事情:

modelBuilder.Entity<TableABC>()
    .HasRequired<TableA>(s => s.TableA)
    .WithMany(s => s.TableABC)
    .HasForeignKey(s => s.IdFkA);

    .HasRequired<TableB>(s => s.TableB)
    .WithMany(s => s.TableABC)
    .HasForeignKey(s => s.IdFkB);

    .HasRequired<TableC>(s => s.TableC)
    .WithMany(s => s.TableABC)
    .HasForeignKey(s => s.IdFkC);

我如何拥有关系表,实际上它是表之间的一对多关系,而不是真正的多对多关系,但我不确定这是否正确。

所以在sumary中,我想知道如何使用流畅的API设置三个表之间的关系。

1 个答案:

答案 0 :(得分:1)

  

我想知道如何设置三者之间的关系   具有流畅API的表格

我觉得你是否想要表之间的多对多关系有点不清楚。但正如你提到的那样“它确实是表格之间的一对多关系”我假设你想要它一对多。

你有3张桌子的事实并没有太大的不同。你只需要做三次相同的事情。假设您的模型看起来像这样(但具有公共属性):

TableA
{
    int IDTableA { get; set; }
    ICollection<TableABC> Relations { get; set; } // Bad name but proves point.
}

TableB
{
    int IDTableB { get; set; }
    ICollection<TableABC> Relations { get; set; }
}

TableC
{
    int IDTableC { get; set; }
    ICollection<TableABC> Relations { get; set; }
}

TableABC
{
    int IDTableA { get; set; }
    TableA A { get; set; }
    int IDTableB { get; set; }
    TableA B { get; set; }
    int? IDTableC { get; set; } // Optional
    TableA C { get; set; }
}

我更喜欢使用{{3}},这使您可以使用this。但是否则您可以使用modelBuilder.Entity<TableABC>()代替。然后你可以这样做:

public class TableABCMap : EntityTypeConfiguration<TableABC>
{
    public TableABCMap()
    {
        this.HasRequired(e => e.TableA)
            .WithMany(x => x.Relations)
            .HasForeignKey(x => x.IDTableA);

        this.HasRequired(e => e.TableB)
            .WithMany(x => x.Relations)
            .HasForeignKey(x => x.IDTableB);

        this.HasOptional(e => e.TableC)
            .WithMany(x => x.Relations)
            .HasForeignKey(x => x.IDTableC);
    }
}

请注意,所有映射都基于TableABC。你也可以反过来做,但我个人更喜欢这种方式。