0

Учитывая сущность,Как предотвратить InvalidOperationException сохранение циклического графа объектов?

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