【问题标题】:How do I prevent InvalidOperationException saving a cyclic graph of entities?如何防止 InvalidOperationException 保存实体的循环图?
【发布时间】:2011-10-13 15:55:44
【问题描述】:

鉴于实体,

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&lt;T&gt;().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 does not seem to handle cycles very well

【问题讨论】:

    标签: c# entity-framework entity-framework-4 cycle invalidoperationexception


    【解决方案1】:

    您好,您需要调整映射:

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

    【讨论】:

    • 我想在你回答的时候我正在制作这个原型!已确认。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2021-05-13
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多