2009-07-02 8 views
5

J'ai remarqué un comportement étrange dans mon service d'importation aujourd'hui lorsque j'ai essayé d'importer plusieurs enregistrements de données.InsertAllOnSubmit insère uniquement le premier enregistrement de données

Quand je le fais comme ça, tous les enregistrements de données sont importées et la valeur auto-incrémentée est correcte (see screenshot):

public void Create(List<Property> properties) 
{ 
    foreach (Property prop in properties) { 
     dbc.Property.InsertOnSubmit(prop); 
     dbc.SubmitChanges(); 
    } 
} 

Quand j'essaie comme ça, seul le premier get d'enregistrement de données est un bon valeur auto-incrémentée (see screenshot):

foreach (Property prop in properties) { 
    dbc.Property.InsertOnSubmit(prop); 
} 
dbc.SubmitChanges(); 

même ici:

dbc.Property.InsertAllOnSubmit(properties); 
dbc.SubmitChanges(); 

Est-ce que quelqu'un a une idée de pourquoi c'est comme ça? Les trois variantes doivent importer tous les enregistrements de données selon ma compréhension, mais les valeurs auto-incrémentées manquantes indiquent que ce n'est pas le cas.

[EDIT] Ajouté deux captures d'écran.

+0

Juste comme une note de côté, êtes-vous sûr que c'est dbc.Property et pas dbc.Properties? LINQ to SQL généralement pluralise les noms de collection ... – BFree

+0

Oui, c'est "Property". J'ai nommé les tables moi-même, elles n'étaient pas générées automatiquement ou quelque chose comme ça. Aussi, s'il s'appelait "Propriétés", alors le premier exemple ne devrait pas fonctionner non plus, devrait-il? –

+0

Il semble que les gens s'entendent sur un problème, mais personne +1? Eh bien, je vais commencer. Cela semble être un bug pour moi. – MattH

Répondre

6

J'ai eu le même problème et il est avéré que la question était due à Equals prépondérants sur la classe mappée. Ma méthode Equals ne faisait que comparer le champ de clé primaire qui était un champ d'identité. Bien sûr, lorsque les objets sont nouveaux, toutes les identités sont 0. Ainsi, lorsque InsertAllOnSubmit a été appelé, il pensait que tous les nouveaux objets étaient identiques et fondamentalement ignorés tous sauf le premier.

2

Pas tout à fait sûr de savoir pourquoi la 2e variante ne fonctionne pas, cependant, ne devrait pas être le dernier:

dbc.Property.InsertallOnSubmit(properties); 
dbc.SubmitChanges(); 

Modifier

Pour la deuxième boucle essayer:

foreach (Property prop in properties) 
{ 
    var newProp = new Property(); 
    newProp = prop; 
    dbc.Property.InsertOnSubmit(newProp); 
} 
dbc.SubmitChanges(); 

Pour la dernière solution, essayez:

dbc.Property.InsertAllOnSubmit(properties.ToList()); 
dbc.SubmitChanges(); 
+0

Oui, bien sûr. Copier et coller l'erreur sur le dernier exemple :) –

+0

Avez-vous des erreurs? – James

+0

Pas d'erreur. J'ai ajouté deux captures d'écran à mon message original. Comme vous pouvez le voir, avec la première méthode, toutes les propriétés obtiennent des ID (les nombres entre crochets []). Sur la deuxième capture d'écran, seule la première propriété obtient un ID. Je n'ai absolument aucune idée de ce qui ne va pas puisque le code fourni est la seule chose différente dans les deux captures d'écran! –

1

J'ai rencontré ce problème il y a quelques minutes.

Mon problème était que la liste que j'ai envoyée à InsertAllOnSubmit<mappedClass>() était pleine d'objets qui provenaient d'une seule instance de mappedClass. Je modifiais les membres en fonction de l'instance du modèle de vue que je voulais ajouter à la base de données, puis réajoutais l'instance à la liste.

On dirait une erreur de débutant mais il pourrait être quelque chose à vérifier si quelqu'un a toujours ce problème!

0

Utilisez simplement cette solution parfaite.
En tant que, Nous avons une nouvelle entité comme "TestTable".
Initialiser cette entité à l'intérieur de la boucle comme

TestTable objTable = new TestTable(); 

et ajoutez les éléments de l'entité ainsi que dans l'objet de liste de la liste <TestTable> en boucle.
Et déplacez InsertAllOnSubmit() en dehors de la boucle for et maintenant cela va fonctionner.

Questions connexes