如何使用流利的 api 与多对多 table 和三个外国人键?
How to use fluent api with a many to many table with three foreigner keys?
我有这些 table:
- 表A(IdA, ---)
- 表B(IdB, ---)
- TableC(IdC, ---)
- TableABC(IdFkA, IdFkB, IdFkC)
此外,我有 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
。你也可以反过来做,但我个人更喜欢这样。
我有这些 table:
- 表A(IdA, ---)
- 表B(IdB, ---)
- TableC(IdC, ---)
- TableABC(IdFkA, IdFkB, IdFkC)
此外,我有 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
。你也可以反过来做,但我个人更喜欢这样。