2010-10-14 7 views
1

J'essaie de persister dans la collecte d'éléments enfants, la solution fonctionne mais je voudrais demander aux personnes plus expérimentées si l'approche est la bonne?Entity Framework Insérer des entités enfants

public bool InsertNewActionHistory(ActionHistory actionHistory) 
    { 
     bool result = false; 

     using (TransactionScope transactionScope = new TransactionScope()) 
     { 
      this.ActionHistories.AddObject(actionHistory); 

      if (actionHistory is ActionUpdate) 
      { 
       foreach (ActionUpdateDetail updateDetail in ((ActionUpdate)actionHistory).ActionUpdateDetails) 
       { 
        ActionUpdateDetails.AddObject(updateDetail); 
       } 
      } 

      this.CommitChanges(); 
      transactionScope.Complete(); 
      result = true; 
     } 

     return result; 
    } 

Répondre

0

Si ActionUpdateDetail est lié à ActionUpdate via une propriété de navigation, vous n'avez pas besoin 3/4 du code. Vous pouvez simplement faire:

public bool InsertNewActionHistory(ActionHistory actionHistory) 
{ 
    this.ActionHistories.AddObject(actionHistory); 
    return true; 
} 

Les propriétés de navigation garantissent que les objets associés sont additionnés. Notez que cela peut être plus difficile si vous utilisez des proxies POCO ou des POCO purs. Les débutants avec l'EF devraient probablement coller avec DB-first ou model-first jusqu'à ce que vous appreniez les règles de la route.

+0

Bonjour Craig, c'est un scénario POCO, approche DB First. Croyez-le ou non, j'ai réussi à le résoudre sans le code unneseccary. Je n'ai aucune idée d'où était le problème. Au premier essai de l'enfant, c'est-à-dire que les propriétés de navigation ne duraient pas du tout ?! Puis j'ai décidé d'essayer avec la portée de la transaction et j'ai fini avec le code présenté. Une fois que j'ai enlevé, progressivement, tout le code inutile, il a commencé à travailler comme il se doit. La méthode CommitChanges a un seul appel à la méthode SaveChanges du contexte. Il se pourrait que la portée de la transaction, ou autre chose, ait bloqué l'enregistrement des enfants. – bignermo

+0

Je vais essayer de revenir en arrière et de reproduire le comportement ackward et le partagerai si je réussis. En tout cas, merci beaucoup pour votre aide :) – bignermo

Questions connexes