如何防止 InvalidOperationException 保存实体的循环图?

发布于 2024-12-09 19:45:27 字数 888 浏览 0 评论 0原文

给定实体,

class A {
    B DefaultB { get; set; }
    C DefaultC { get; set; }
}

class B {
    A { get; set; }
}

class C {
    A { get; set; }
}

其中 A.DefaultBA.DefaultC 是可选的,

modelBuilder.Entity<A>().HasOptional(x => x.DefaultB).WithMany();
modelBuilder.Entity<A>().HasOptional(x => x.DefaultC).WithMany(); 

context.Set().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 似乎不能很好地处理循环

Given the entities,

class A {
    B DefaultB { get; set; }
    C DefaultC { get; set; }
}

class B {
    A { get; set; }
}

class C {
    A { get; set; }
}

where A.DefaultB and A.DefaultC are optional,

modelBuilder.Entity<A>().HasOptional(x => x.DefaultB).WithMany();
modelBuilder.Entity<A>().HasOptional(x => x.DefaultC).WithMany(); 

what combination of context.Set<T>().Add(...) and context.SaveChanges() would work to save the following object graph?

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...

As it is now, I get an InvalidOperationException (collection modification while iterating) because EF does not seem to handle cycles very well.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

缺⑴份安定 2024-12-16 19:45:27

您好,您需要调整您的映射:

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();

Hi you need to adjust your mapping:

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);

And the correct save order with this mapping:

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();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文