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的处理:输入'。
看到这个:
// 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.CurrentHandling并handling.Entry再次保存更改。
您可能需要将此代码包装在事务中。
顺便说一下,这条线entry.Handlings.Add(handling);是多余的。
| 归档时间: |
|
| 查看次数: |
862 次 |
| 最近记录: |