2009-04-12 9 views
0

Je travaille avec Entity Framework quelques semaines seulement. C'est génial, mais comment dois-je ajouter correctement une nouvelle ligne avec des sous-éléments référencés (tables)?Ajout d'une nouvelle ligne aux types référencés dans Entity Framework

J'ai essayé cette procédure

CMS.ShopOrder order = new CMS.ShopOrder(); 

    order.CreatedOn = DateTime.Now; 

    foreach (var item in CMS.CurrentSession.Cart.Items) 
    {   
     order.ShopOrderItems.Add(item); 
    } 

    db.AddToShopOrder(order);  

    int selT = FormatHelper.GetInt32(ddTransport.SelectedValue); 
    int selP = FormatHelper.GetInt32(ddTransport.SelectedValue);  

    order.Transportation = db.Transportation.Where(t => t.Id == selT).FirstOrDefault(); 
    order.Payment = db.Payment.Where(p => p.Id == selP).FirstOrDefault(); 
    order.Customer = db.Customer.Where(c=>c.Id == CMS.CurrentSession.Customer.Id).FirstOrDefault(); 

    db.SaveChanges(); 

mais je me suis erreur:

An entity object cannot be referenced by multiple instances of IEntityChangeTracker. Line 492: base.AddObject("ShopOrder", shopOrder);

Puis-je ajouter tous ces enregistrements à la fois?

Merci beaucoup.

Répondre

2

Il semble que vous ayez un problème avec la gestion du contexte de votre objet. L'erreur indique que l'entité est déjà associée à un contexte d'objet lorsque vous essayez de l'ajouter. Je suppose que vous gardez certaines entités actives lors de l'exécution de plusieurs requêtes Web, mais vous créez un nouveau contexte d'objet pour chaque requête Web. Vous devez détacher les entités de l'ancien contexte et les attacher à la nouvelle pour que cela fonctionne. Voir le MSDN pour un problème similaire.

0

Merci danbruc,

le problème était que je ne détache pas l'objet de EntityContext quand j'ajoutais à la session.

Cela fonctionne:

public CMS.ProductVariant GetProductVariantById(int id) 
    { 
     ProductVariant pv = null; 
     if (id > 0) 
     { 
      using (db = new CmsEntity()) 
      { 
       pv = db.ProductVariant.Where(v => v.Id == id).FirstOrDefault(); 
       db.Detach(pv); 
      } 
     } 
     return pv; 
    } 
Questions connexes