EF Core的多个导航属性产生循环依赖

Mar*_*rio 2 entity-framework-core

我具有以下映射配置:

入门级:

entity
    .HasOne(e => e.CurrentHandling)
    .WithOne()
    .HasForeignKey<Entry>(e => e.CurrentHandlingID)
    ;

entity
    .HasMany(e => e.Handlings)
    .WithOne(h => h.Entry)
    .HasForeignKey(h => h.EntryID)
    ;
Run Code Online (Sandbox Code Playgroud)

处理类:

entity
    .HasOne(h => h.Entry)
    .WithMany(e => e.Handlings)
    .HasForeignKey(h => h.EntryID)
        .OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);
Run Code Online (Sandbox Code Playgroud)

企业风险管理: 在此处输入图片说明

当我尝试保存上下文时,出现以下异常:

System.InvalidOperationException:'无法保存更改,因为在要保存的数据中检测到循环依赖性:'ForeignKey:Entry.CurrentHandlingID-> Handling.HandlingID唯一ToPrincipal:CurrentHandling,ForeignKey:Handling.EntryID-> Entry.EntryID ToDependent: ToPrincipal的处理:输入'。

测试数据:

errorRepo.EnableBulkModus();

var handling = errorRepo.AddHandling(new Handling {
     CorrectedMessage = "correct",
     HandlingStatusID = 7,
     Updated = DateTime.UtcNow,
     UpdatedBy = nameof(DbInitializer)
});

var reference = errorRepo.AddReference(new Reference {
    ForeignKeyTypeID = 4,
    ForeignKeyValue = "42",
    Name = "SystemB",
    ReferenceTypeID = 6
});

var entry = errorRepo.AddEntry(new Entry {
    CurrentHandling = handling,
    DisplayMessage = "Wrong!",
    ErrorMessage = "error!",
    Inserted = DateTime.UtcNow.AddMinutes(-5),
    OriginalMessage = "incorrect",
    InsertedBy = nameof(DbInitializer),
    UUID = Guid.NewGuid(),
    Reference = reference,
    StatusID = 5
});

handling.Entry = entry;
entry.Handlings.Add(handling);

errorRepo.DisableBulkModus(true);
Run Code Online (Sandbox Code Playgroud)

errorRepo.EnableBulkModus();仅设置一个标志,该标志指示在调用CommitChanges() Same with 时不保存存储库errorRepo.DisableBulkModus(true);,它将标志设置为false。布尔值指示存储库应执行CommitChanges()

如何更改映射以避免循环依赖?

亲切的问候。

编辑(11.03.2017)

我从处理类中删除了映射,并.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict)在条目类中添加了这一行:

    entity
        .HasMany(e => e.Handlings)
        .WithOne(h => h.Entry)
        .HasForeignKey(h => h.EntryID)
        .OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict)
        ;
Run Code Online (Sandbox Code Playgroud)

同样的例外:

System.InvalidOperationException:'无法保存更改,因为在要保存的数据中检测到循环依赖性:'ForeignKey:Entry.CurrentHandlingID-> Handling.HandlingID唯一ToPrincipal:CurrentHandling,ForeignKey:Handling.EntryID-> Entry.EntryID ToDependent: ToPrincipal的处理:输入'。

Ger*_*old 5

看到这个:

// 1.
var entry = errorRepo.AddEntry(new Entry {
    CurrentHandling = handling,
    ...
});
...
// 2.
handling.Entry = entry;
Run Code Online (Sandbox Code Playgroud)

1.以下代码要求entry接收handling的主键作为外键。2.下面的代码要求handlingreveive entry的主键为FK:鸡和蛋的问题。

由于handling取决于entry(由于1-0..1关系),entry应首先插入- CurrentHandling尚未设置其属性。然后保存更改,因此entry知道其生成的PK。然后设置entry.CurrentHandlinghandling.Entry再次保存更改。

您可能需要将此代码包装在事务中。

顺便说一下,这条线entry.Handlings.Add(handling);是多余的。