Entity framework 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 {

我正在尝试使用EF Core 5建立多对多关系。这里的想法是将表实体链接到其他表实体。当前我的模型如下所示:

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}