2010-09-16 4 views
0

J'ai une fonction que je veux retourner une nouvelle entité avec des entités enfants déjà attachés. Ce que je ne veux pas faire est de les créer dans la base de données d'abord. Je veux juste créer une nouvelle instance de l'entité, créer de nouvelles entités enfants et les ajouter à l'entité parent avant de renvoyer l'entité parente dans la fonction.Entity Framework: Créer une entité, attacher des entités enfant, faire des choses, puis persister des entités ... comment?

J'ai commencé avec ce code;

public BusinessEntities.Event CreateEventWithDefaultActions(EventType eventType) 
    { 
     Facades.Event eventFacade = new Facades.Event(); 
     IList<BusinessEntities.DefaultAction> defaultActions; 

     // new event 
     BusinessEntities.Event skeletonEvent = new BusinessEntities.Event(); 
     skeletonEvent.EventType = eventType; 

     // load the default actions 
     defaultActions = eventFacade.LoadDefaultActionTypes(eventType); 

     // create a new action and attach to the event 
     foreach (BusinessEntities.DefaultAction defaultAction in defaultActions) 
     { 
      BusinessEntities.Action action = new BusinessEntities.Action(); 

      if(!defaultAction.ActionTypeReference.IsLoaded) 
       defaultAction.ActionTypeReference.Load(); 

      action.ActionType = defaultAction.ActionType;     
      skeletonEvent.Actions.Attach(action); // exception thrown 
     } 

     return skeletonEvent; 
    } 

Essentiellement, je suis en train de créer une nouvelle entité de l'événement, ce qui peut avoir associé des entités d'action - puis essayer de charger certaines actions en fonction de leur type et fixer les entités d'action à l'entitiy de l'événement. Lorsque la ligne de code skeletonEvent.Actions.Attach (action); est exécuté l'exception suivante est levée;

L'association n'est pas une opération valide lorsque l'objet source associé à cette extrémité liée est dans un état ajouté, supprimé ou détaché. Les objets chargés à l'aide de l'option de fusion NoTracking sont toujours détachés.

Où vais-je me tromper? Peut-être que vous devriez essayer d'utiliser la méthode Add au lieu de Attach.

Répondre

1

Attacher doit être utilisé lorsque les deux entités sont suivies par le contexte de l'objet. Vous devrez peut-être ajouter l'objet Event à ObjectContext à l'aide de la méthode AddObject (ou AddToEvent générée).

+0

Je ne veux pas d'objets suivis par le contexte, je veux qu'ils soient détachés du contexte afin qu'ils puissent être retournés par la fonction sans liens. Une autre fonction gérera l'attachement quand ils doivent être sauvés. – Carl

+0

L'utilisation de la méthode .Add() renvoie une erreur différente; L'objet n'a pas pu être ajouté à EntityCollection ou EntityReference. Un objet attaché à un objet ObjectContext ne peut pas être ajouté à un objet EntityCollection ou EntityReference qui n'est pas associé à un objet source. – Carl

+0

Si je vous ai bien compris, vous voulez probablement construire un graphe d'objet sur une couche (client) et ensuite le soumettre à une couche de service faisant de la persistance. Vous devriez peut-être utiliser les entités POCO de EF4 - voir cet article (http://msdn.microsoft.com/fr-fr/magazine/ee335715.aspx) pour les choix disponibles avec POCO. – VinayC

Questions connexes