2012-01-05 27 views
8

tengo este trozo de código:LINQ no puede encontrar el registro insertado antes SubmitChanges

LinqDataContext ctx; 

MyRecord R = new MyRecord(); 
R.Title = "test"; 
ctx.AllRecords.InsertOnSubmit(R); 

bool bExists = ctx.AllRecords.Any(r => r.Title == "test"); 

Nota: No he llamado a SubmitChanges.

¿Por qué bExists vuelve como falso? ¿No debería Linq ver el registro insertado?

Respuesta

1

creo que

bool bExists = ctx.AllRecords.Any(r => r.Title == "test"); 

es una consulta SQL que el servidor SQL devuelve el resultado. Así que si usted no ha presentado, a continuación, el PP no sabe nada acerca de:

MyRecord R = new MyRecord(); 
R.Title = "test"; 
+0

Bien, pero mi punto es que Lin2SQL debería elegir eso ¿no? ¿No almacena en caché los objetos? ¿Hay algún método al que pueda llamar que también verifique el caché? – Jack

+0

L2S almacena objetos en caché, pero creo que los datos no enviados se almacenan en una ubicación diferente a los datos "reales". No tendría sentido almacenarlos en la misma ubicación porque si modifica una entrada y luego vuelve a consultar la entrada original, no querría que ninguna entrada (original o modificada) quede anulada. –

8

Ver LINQ no puede escribir valores en DB, si SubmitChanges() no llama.

Y para la segunda pregunta, Sí, Linq caché de los objetos antes de enviar. También podemos obtener registros que están en caché pero no se han enviado a la base de datos.

Como se ha insertado registro anterior, podemos obtener por encima de registro de la memoria caché de DataContext de la siguiente manera:

En primer lugar obtener conjunto de cambios de DataContext como:

System.Data.Linq.ChangeSet MySet = ctx.GetChangeSet(); 

Tras ello, extraer su registro de forma Conjunto de cambios:

MyRecord b = (MyRecord)MySet.Inserts.Last(); 

Obtendrá MyRecord con el título como "prueba", que ha insertado.

Espero que esto ayude.

Cuestiones relacionadas