2009-07-02 15 views
5

Hoy noté un comportamiento extraño en mi servicio de importación cuando traté de importar múltiples registros de datos.InsertAllOnSubmit solo inserta el primer registro de datos

Cuando lo hago de esta manera, todos los datos de los registros son importados y el valor auto-incrementales es correcta (see screenshot):

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

Cuando lo intento como éste, sólo la primera obtener el registro de datos de una correcta valor auto-incrementales (see screenshot):

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

mismo digo:

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

¿Alguien tiene una idea de por qué es así? Las tres variantes deberían importar todos los registros de datos de acuerdo con mi comprensión, pero los valores faltantes autoincrementados indican que no es así.

[EDITAR] Se agregaron dos capturas de pantalla.

+0

Como nota al margen, ¿está seguro de que es dbc.Property y no dbc.Properties? LINQ to SQL generalmente pluraliza los nombres de la colección ... – BFree

+0

Sí, es "Propiedad". Yo nombré las tablas yo mismo, no fueron generadas automáticamente o algo así. Además, si se llamara "Propiedades", entonces el primer ejemplo tampoco debería funcionar, ¿o sí? –

+0

Parece que la gente acepta que es un problema, pero nadie +1? Bueno, voy a comenzar. Esto suena como que podría ser un error para mí. – MattH

Respuesta

6

que tenían el mismo problema y resultó que el problema se debía a los Iguales primordiales en la clase mapeada. El método My Equals solo comparaba el campo clave principal que era un campo de identidad. Por supuesto, cuando los objetos son nuevos, todas las identidades son 0. Entonces, cuando se llamó a InsertAllOnSubmit, pensó que todos los objetos nuevos eran iguales e ignoraron básicamente a todos menos al primero.

2

No estoy seguro de por qué el segundo variación no funciona, sin embargo, no debe ser el último:

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

Editar

Para el segundo intento de bucle:

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

Para la última solución intento:

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

Sí, por supuesto. Copiar y pegar error en el último ejemplo :) –

+0

¿Obtiene algún error? – James

+0

Sin errores. He agregado dos capturas de pantalla a mi publicación original. Como puede ver, con el primer método, todas las propiedades obtienen ID (los números entre corchetes []). En la segunda captura de pantalla, solo la primera propiedad obtiene una ID. ¡No tengo absolutamente ninguna idea de lo que está mal, ya que el código proporcionado es lo único que es diferente en ambas capturas de pantalla! –

1

Me encontré con este problema hace unos minutos.

Mi problema es que la lista que envié al InsertAllOnSubmit<mappedClass>() estaba llena de objetos que se originaron en una sola instancia de mappedClass. Estaba modificando los miembros según la instancia del modelo de vista que quería agregar a la base de datos y luego volviendo a agregar la instancia a la lista.

Parece un error de principiante, pero podría ser algo para comprobar si alguien todavía tiene este problema.

0

Simplemente use esta solución perfecta.
Como, tenemos una nueva entidad como "TestTable".
Inicializar esta entidad dentro del bucle como

TestTable objTable = new TestTable(); 

y añadir los elementos de la entidad, así como en la lista de objetos de la lista <TestTable> en bucle.
Y mueva InsertAllOnSubmit() fuera del ciclo for y ahora debe funcionar.

Cuestiones relacionadas