2010-10-19 4 views
2

J'ai une configuration de projet de structure d'entité. Il y a quatre tables et trois entités ("A", "B", & "C"). Il y a une relation 1: n entre A et B et entre A et C, et un: n relation entre B et C.Comment ajouter des relations enfants lors de la création d'un nouvel objet dans Entity Framework

alt text

J'utilise le code suivant pour essayer d'ajouter un nouveau « B "entité:

A t = null; 
if (this.MyA == null) 
{ 
    t = new A() 
    { 
     EntityKey = this.MyAReference.EntityKey, 
     AId = (Guid)this.MyAReference.EntityKey.EntityKeyValues[0].Value 
    }; 
} 
else 
{ 
    t = this.MyA; 
} 
this.MyA = null; 
context.Attach(t); 
this.MyA = t; 

L'objet" B "(" this ") possède une collection enfant d'objets" C ". Ces objets "C" existent déjà dans la base de données, mais ne sont pas liés au nouvel objet (évidemment). Quand j'appelle "SaveChanges()", il lance une exception car il essaie d'ajouter à tous les objets "C" enfant un nouvel objet dans la base de données.

Comment puis-je l'obtenir pour créer simplement la référence dans le "Table_JoinBC", et ne pas essayer de recréer les objets "C"?

Merci pour toute aide.

Répondre

2

Il est plus facile si vous utilisez stub entities

Vous avez dit que vous vouliez ajouter un nouvel objet B. Et pour ajouter un objet B vous avez besoin d'un objet A

Voici un exemple en utilisant des entités stub:

A myAObject = new A { A_Id = 5 }; 

Context.AttachTo("Aes", myAObject); 

B myBObject = new B { B_ID = 6, A = myAObject); 

Context.AddToBes(myBObject) 
Context.SaveChanges(); 
+0

Un conseil utile, mais cela ne semble pas résoudre le problème. J'ai essayé plusieurs configurations différentes sans aucune chance. – Sako73

+0

@ Sako73 ... Je viens de mettre à jour ma réponse avec un exemple sur comment ajouter un nouvel objet B en utilisant les entités STUB –

+0

Quelle serait la solution la plus courte et la plus propre pour faire la même chose si vous n'êtes pas sûr que A est dans la base de données? Dans certains cas, il devrait également être inséré? – watbywbarif

1

Voici ce que je suis arrivé à travailler, avec les collections enfants:

A myAObject = new A { A_Id = 5 }; 

Context.AttachTo("Aes", myAObject); 

B myBObject = new B() { 
    B_ID = 6, 
    A = myAObject}; 

foreach(C c_obj in CsCollection){ 
    Context.AttachTo("Cs", c_obj); 
    myBObject.C.Add(c_obj); 
} 


Context.AddToProducts(myBObject) 
Context.SaveChanges(); 

Merci.

Questions connexes