Entity framework core 实体框架核心5与引用自身的同一实体的多对多关系
我正在尝试使用EF Core 5建立多对多关系。这里的想法是将表实体链接到其他表实体。当前我的模型如下所示:Entity framework core 实体框架核心5与引用自身的同一实体的多对多关系,entity-framework-core,.net-5,ef-core-5.0,entity-framework-core-5,Entity Framework Core,.net 5,Ef Core 5.0,Entity Framework Core 5,我正在尝试使用EF Core 5建立多对多关系。这里的想法是将表实体链接到其他表实体。当前我的模型如下所示: public class PlanTable : PlanItem { ---///--- UnrelatedProperties public ICollection<PlanTable> LinkedTables { get; set; } } public class TableLink { public int FirstTableId {
public class PlanTable : PlanItem
{
---///--- UnrelatedProperties
public ICollection<PlanTable> LinkedTables { get; set; }
}
public class TableLink
{
public int FirstTableId { get; set; }
public int SecondTableId { get; set; }
public PlanTable FirstTable { get; set; }
public PlanTable SecondTable { get; set; }
}
---///--- updating other entities
var existingTableLinks = await DbContext.TableLinks.Where(tl =>
tableIds.Contains(tl.FirstTableId) || tableIds.Contains(tl.SecondTableId)).ToListAsync();
foreach (var incomingLinkedTable in incomingTable.LinkedTables)
{
var existingLink = existingTableLinks.SingleOrDefault(etl => etl.FirstTableId == existingTable.Id && etl.SecondTableId == incomingLinkedTable.Id);
if (existingLink is null)
{
await DbContext.AddAsync(new TableLink
{
FirstTableId = existingTable.Id,
SecondTableId = incomingLinkedTable.Id
});
}
}
----///----- continue updating other entities
使用fluent API调用:
modelBuilder.Entity<PlanTable>()
.HasMany(x => x.LinkedTables)
.WithMany(x => x.LinkedTables)
.UsingEntity<TableLink>(
x => x.HasOne(tl => tl.FirstTable)
.WithMany().HasForeignKey(tl => tl.FirstTableId),
x => x.HasOne(tl => tl.SecondTable)
.WithMany().HasForeignKey(tl => tl.SecondTableId),
x => x.HasKey(tl => new { tl.FirstTableId, tl.SecondTableId }));
问题是,当我检查change tracker时,LinkedTables
引用自身,而不是它应该引用的表。在这种情况下,id为37的表应链接到id为38的表,反之亦然
PlanTable {Id: 37} Unchanged
Id: 37 PK FK
Height: 96
Svg: 'path fill="none" stroke="#000" paint-order="fill stroke mark...'
Width: 192
X: 120
Y: 120
Number: 1
PlanId: 3 FK
Seats: 4
Plan: {Id: 3}
Reservations: <null>
LinkedTables: [{Id: 37}]
PlanTable {Id: 38} Unchanged
Id: 38 PK FK
Height: 96
Svg: 'path fill="none" stroke="#000" paint-order="fill stroke mark...'
Width: 192
X: 168
Y: 360
Number: 2
PlanId: 3 FK
Seats: 4
Plan: {Id: 3}
Reservations: <null>
LinkedTables: [{Id: 38}]
TableLink {FirstTableId: 37, SecondTableId: 38} Added
FirstTableId: 37 PK FK
SecondTableId: 38 PK FK
FirstTable: {Id: 37}
SecondTable: {Id: 38}
TableLink {FirstTableId: 38, SecondTableId: 37} Added
FirstTableId: 38 PK FK
SecondTableId: 37 PK FK
FirstTable: {Id: 38}
SecondTable: {Id: 37}
PlanTable{Id:37}未更改
Id:37 PK FK
身高:96
Svg:'path fill=“none”stroke=“#000”paint order=“fill stroke mark…”
宽度:192
X:120
Y:120
编号:1
平面图:3 FK
座位:4
计划:{Id:3}
保留:
LinkedTables:[{Id:37}]
可种植{Id:38}未改变
Id:38 PK FK
身高:96
Svg:'path fill=“none”stroke=“#000”paint order=“fill stroke mark…”
宽度:192
X:168
Y:360
编号:2
平面图:3 FK
座位:4
计划:{Id:3}
保留:
LinkedTables:[{Id:38}]
TableLink{FirstTableId:37,SecondTableId:38}已添加
FirstTableId:37 PK FK
第二个表ID:38 PK FK
第一个表:{Id:37}
第二个表:{Id:38}
TableLink{FirstTableId:38,SecondTableId:37}已添加
FirstTableId:38 PK FK
第二个表ID:37 PK FK
第一个表:{Id:38}
第二个表:{Id:37}