如何使用流利的 api 与多对多 table 和三个外国人键?

How to use fluent api with a many to many table with three foreigner keys?

我有这些 table:

此外,我有 4 个 POCO 对象:

TableA
{
    IDTableA;
}

TableB
{
    IDTableB;
}

TableC
{
    IDTableC;
}

TableABC
{
    IDTableA;
    IDTableB;
    IDTableC;
}

注意:我知道我没有显示导航属性,但这只是说我也有 realtion table 的 POCO 实体,这不像我有很多许多关系只有两个 tables.

TableABC 将三列 IdFkA、IdFkB、IdFkC 作为键。我想知道如何使用 EF6 和 fluent 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);

我怎么会有关系 table,实际上它是 table 之间的一对多关系,而不是真正的多对多关系,但我不确定这是否正确.

所以总结一下,我想知道如何用流利的API设置三个table之间的关系。

I would like to know how to set the relationship between the three tables with fluent API

我发现有点不清楚你是否想要表之间的 many-to-many 关系。但是正如您提到的“实际上它是表之间的一对多关系”我假设您想要它one-to-many。

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

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; }
}

我更喜欢使用 EntityTypeConfiguration,这使您可以使用 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。你也可以反过来做,但我个人更喜欢这样。