2009-06-23 7 views
12

Estoy tratando de insertar un registro. Este código funcionó pero dejó de funcionar. No sé por qué. Aquí está el código:LINQ to SQL Lanzamientos básicos de inserción: adjuntar o agregar no nueva entidad relacionada con la excepción

using (SAASDataContext dc = new SAASDataContext()) 
{ 
    tblAssessment a2 = new tblAssessment(); 

    a2.AssessmentCentreId = centreId; 
    a2.AttemptNumber = 1; 

    dc.tblAssessments.InsertOnSubmit(a2); 
    dc.SubmitChanges(); 

    CurrentAssessmentId = a2.AssessmentId; 
} 

El código compila pero produce la excepción a continuación en la línea dc.SubmitChanges();.

excepción lanzada: Se ha hecho

Un intento de Adjuntar o Agregar una entidad que no es nueva, quizá haber sido cargado desde otro DataContext. Esto no es compatible con .

Notas: AssessmentCentreId es una clave externa en tblCentre, centreId es una identificación válida centro ya existente, AssessmentCentreId y AttemptNumber no son los únicos campos nulos todos los demás columnas permiten valores nulos.

He buscado en Google pero todos los resultados parecen pertenecer a personas que intentan adjuntar entidades extraídas de otros DataContext desconectados. No estoy haciendo eso, así que estoy perplejo.

ACTUALIZACIÓN:

Adición

dc.DeferredLoadingEnabled = false; 

en la parte superior del bloque de usar hace que funcione, pero me gustaría saber por qué coz no tengo ni idea por el momento la tecnología suficientemente avanzada siendo indistinguible de la magia en este momento :)

+2

Le estoy dando un +1 por hacerme reir - además de tener el mismo problema ... – John

Respuesta

4

La cuestión es que el objeto Centro no existe en el contexto. Está en el DB, pero no está "en tu mano" con a2.Prueba esto: entonces existir

a2.AssessmentCentre = dc.AssessmentCentres.SingleOrDefault(
    d=>d.AssessmentCentreId.Equals(centreId)); 

El objeto AssessmentCentre en el contexto, que significa que no habrá ningún problema con lo conecta a a2.

0

Si estas son las únicas columnas que no son nulas, ¿dónde está la clave principal? LINQ to SQL requiere una clave primaria para insertar datos. Si está utilizando AssessmentCentreId solo o junto con AttemptNumber como compuesto, ¿está seguro de que no está tratando de insertar una clave duplicada?

+0

La clave principal tampoco es nula, y es una identidad de autonumber (1,1) –

7

Esto me estaba molestando también. Investigué un poco y encontré mucha confusión y algunos descuidos con respecto a entidades aisladas. Luego encontré una buena solución en codeplex que ha resuelto el problema inmediato y ha ampliado enormemente la funcionalidad de linq2sql. Es una clase pequeña que es realmente fácil de implementar y forma una EntityBase para los proyectos de dbml.

Aquí está la descripción oficial y el enlace. LINQ to SQL Entity Base es una clase base simple que está diseñada principalmente para admitir LINQ to SQL de forma desconectada, que es una de las deficiencias de la tecnología LINQ to SQL en la actualidad. Esto es muy útil en un entorno n-Tier, distribuido o ASP.NET donde la funcionalidad desconectada es relavent.

http://linq2sqleb.codeplex.com/

la esperanza que esto ayude a que está teniendo similar.

Jerome Vernon

+0

Esto fue realmente útil, tratando con entidades desconectadas es la mayor caída del uso de L2SQL sobre WCF – Neil