2010-03-28 5 views
2

J'essaie d'insérer plusieurs éléments nouvellement créés dans la base de données. J'ai une classe générée LINQ2SQL appelée "Order".LINQ to SQL - Insert produisant un comportement étrange

Dans l'ordre, il existe une propriété appelée "OrderItems" qui est également générée par LINQ2SQL et représente les éléments de cet ordre.

Jusqu'ici tout va bien. Le problème que j'ai en ce moment, c'est lorsque j'essaie d'ajouter plus d'un OrderItem nouvellement créé dans Order.

i.e.:

Order o = orderWorker.GetById(10); 
for(int i=0; i < 5; ++i) { 
    OrderItem oi =new OrderItem { 
       Order = o, 
       Price = 100, 
       ShippingPrice = 100, 
       ShippingMethod = ..., 
       Item = someItem 
      }; 
    o.OrderItems.Add(oi); 
} 

context.SubmitChanges(); 

Malheureusement, une seule entité est ajoutée. Oui, j'ai vérifié le SQL généré en ajoutant Context.Log = Console.Out, et oui, une seule instruction a été créée.

Des indices? Par ailleurs, je sais que je ne suis pas en utilisant InsertOnSubmit, la documentation dit:

Vous pouvez demander explicitement les insertions à l'aide InsertOnSubmit. Alternativement, LINQ to SQL peut déduire Inserts par trouver des objets connectés à l'un des les objets connus qui doivent être mis à jour. Par exemple, si vous ajoutez un objet Untracked à un EntitySet (TEntity) ou définir une EntityRef (TEntity) à un objet Untracked, vous faites l'objet Untracked accessible par le biais d'objets suivis dans le graphique. Lors du traitement de SubmitChanges, LINQ to SQL traverse les objets suivis et découvre tous les objets persistants accessibles qui ne sont pas suivis . De tels objets sont candidats pour insertion dans la base de données .

Merci beaucoup pour votre temps.

Répondre

2

Problème résolu, en quelque sorte.

Le problème était que j'ai implémenté naïvement la méthode GetHashcode. Cela signifiait renvoyer les hashcodes appropriés pour les entités déjà créées, mais pour les entités nouvellement créées (qui n'avaient pas d'ID affecté), il retournait le même hashcode.

J'ai donc désactivé mon implémentation de Equals & GetHashcode, et cela a très bien fonctionné. Merci d'avoir essayé =)

+0

Merci pour nourrir ce retour - intéressant. –

+0

Cela n'a pas beaucoup de sens ... Pourquoi ne pourrais-je pas insérer 2 nouveaux objets qui ont la même valeur de hachage et qui comparent Equals? –

0

Cela peut sembler fou, mais je me demande si cela fonctionnera différemment si vous supprimez l'affectation Order = o, et ajoutez-le simplement à la collection OrderLines. Essayez-le, au moins.

+0

J'ai essayé cette recommandation mais elle n'a pas fonctionné. Il ajoute toujours un seul élément. Eh bien, il me surprend un peu ce comportement. Je veux dire que si quelque chose n'allait vraiment pas, aucune entité ne serait ajoutée, mais le fait qu'un seul soit ajouté, me fait peur. Je crois que cela a à voir avec le fait que LINQ2SQL perçoit toutes les nouvelles entités que j'ai créées, comme la même entité ...bizarre = \ –