Я считаю, что проблема с отображениями Foo.Dependents <-> DependencyFoo.Dependent
и Foo.DependentsOf <-> DependencyFoo.DependentOf
.
Фактические иждивенцы / иждивенцы foo
должны действительно быть что-то вроде (псевдокод):
IEnumerable<Foo> fooDependents = db.Set<DependencyFoo>()
.Where(d => d.DependentOf.Id == foo.Id)
.Select(d => d.Dependent);
IEnumerable<Foo> fooDependentsOf = db.Set<DependencyFoo>()
.Where(d => d.Dependent.Id == foo.Id)
.Select(d => d.DependentOf);
Обратите внимание, как происходит обмен ролями коллекций в основном объекте и ссылочных навигационных свойствах в объекте ссылки. Чтобы получить зависимых , необходимо выбрать связанный зависимый , отфильтрованный по зависимому из . И наоборот.
В настоящее время вы установили dependencyFoo.DependentOfId = fooDb.Id
, а также foo.DependentsOf.Add(dependencyFoo);
. Оба они представляют одно и то же, поэтому, когда вы вызываете add, исправление EF Core генерирует новый Guid для for.Id
и присваивает его dependencyFoo.DependentOfId
. В то же время, dependencyFoo.Dependent
остается null
, и поскольку значение dependencyFoo.DependentId
равно Guid.Empty
, EF Core создает и назначает ему новый Guid.
Чтобы устранить проблему, просто поменяйте коллекции в беглом отображении:
modelBuilder.Entity<DependencyFoo>()
.HasOne(x => x.DependentOf)
.WithMany(x => x.Dependents)
.HasForeignKey(x => x.DependentOfId)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<DependencyFoo>()
.HasOne(x => x.Dependent)
.WithMany(x => x.DependentsOf)
.HasForeignKey(x => x.DependentId);
или альтернативно (эффект тот же, мне просто легче читать и следовать):
modelBuilder.Entity<Foo>()
.HasMany(x => x.Dependents)
.WithOne(x => x.DependentOf)
.HasForeignKey(x => x.DependentOfId)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<Foo>()
.HasMany(x => x.DependentsOf)
.WithOne(x => x.Dependent)
.HasForeignKey(x => x.DependentId);