0

鑑於實體,如何防止InvalidOperationException存儲實體的循環圖?

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<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 does not seem to handle cycles very well

回答

0

嗨,你需要調整你的映射:

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

我想我是這個原型爲你解答!證實。 – Kit