我如何防止InvalidOperationException保存实体的循环图
本文关键字:循环 实体 保存 何防止 InvalidOperationException | 更新日期: 2023-09-27 18:11:14
给定实体,
class A {
B DefaultB { get; set; }
C DefaultC { get; set; }
}
class B {
A { get; set; }
}
class C {
A { get; set; }
}
其中A.DefaultB
和A.DefaultC
是可选的,
modelBuilder.Entity<A>().HasOptional(x => x.DefaultB).WithMany();
modelBuilder.Entity<A>().HasOptional(x => x.DefaultC).WithMany();
context.Set<T>().Add(...)
和context.SaveChanges()
的什么组合可以保存下面的对象图?
var b = new B();
var c = new C();
var a = new A { DefaultB = b, DefaultC = c, };
b.A = a;
c.A = a;
// now save these...
就像现在一样,我得到了InvalidOperationException
(在迭代时修改集合),因为EF似乎不能很好地处理循环。
你好,你需要调整你的映射:
modelBuilder.Entity<A>().HasOptional(a => a.DefaultB);
modelBuilder.Entity<A>().HasOptional(m => m.DefaultC);
modelBuilder.Entity<B>().HasRequired(m => m.A);
modelBuilder.Entity<C>().HasRequired(m => m.A);
和正确的保存顺序与这个映射:
var a = new A() { Id = 3 };
context.As.Add(a);
context.SaveChanges();
var b = new B() { Id = 1};
var c = new C() { Id = 2 };
context.Bs.Add(b);
context.Cs.Add(c);
b.A = a;
c.A = a;
a.DefaultB = b;
a.DefaultC = c;
context.SaveChanges();