problemas con la cache de Linqtosql

24/09/2008 - 13:22 por [Juanjo] | Informe spam
hola gente:

Tengo el siguiente problema, estoy seguro de que es una tonteria, pero
no doy.

tengo una aplicacion que accede a una base de datos SQL server con LINQ.

Cuando realizo esto:
1. Ejecuto 2 veces la misma aplicacion.
2. Accedo al mismo registro de la misma base de datos desde las dos
ejecuciones
3. Desde una ejecucion modifico algun dato
4. Desde la otra ejecucion vuelvo a recuperar el mismo registro
5. Esta ultima ejecucion no "ve" los cambios efectuados.

Alguien sabe como limpiar la cache?

Muchas gracias

Preguntas similare

Leer las respuestas

#1 Octavio Hernandez
26/09/2008 - 11:40 | Informe spam
Hola, Juanjo!

El contexto ve que ya tiene ese objeto en memoria (por la clave primaria) y
no lo vuelve a traer.
Para "refrescarlo", utiliza el método Refresh() del contexto, que puede
aplicarse a un objeto concreto o un conjunto de objetos. Te mando un
ejemplillo.

Slds - Octavio


using System;
using System.Linq;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var ctx = new Futbol2006DataContext();
Console.WriteLine("Leo registro");
var q = (from c in ctx.Clubs
where c.Codigo == "RMA"
select c).Single();
Console.WriteLine(q.Nombre);
Console.Write("Modificar?");
string s = Console.ReadLine().ToUpper();
if (s[0] == 'S')
{
q.Nombre = q.Nombre + "***";
ctx.SubmitChanges();
}
Console.WriteLine("Vuelvo a leer");
try
{
// AQUI
ctx.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues,
q);
Console.WriteLine(q.Nombre);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

Console.ReadLine();
}
}
}





"[Juanjo]" wrote in message
news:%
hola gente:

Tengo el siguiente problema, estoy seguro de que es una tonteria, pero
no doy.

tengo una aplicacion que accede a una base de datos SQL server con
LINQ.

Cuando realizo esto:
1. Ejecuto 2 veces la misma aplicacion.
2. Accedo al mismo registro de la misma base de datos desde las dos
ejecuciones
3. Desde una ejecucion modifico algun dato
4. Desde la otra ejecucion vuelvo a recuperar el mismo registro
5. Esta ultima ejecucion no "ve" los cambios efectuados.

Alguien sabe como limpiar la cache?

Muchas gracias



Respuesta Responder a este mensaje
#2 [Juanjo]
28/09/2008 - 23:30 | Informe spam
Gracias octavio:

El problema no es solo con un registro en concreto, creo que es mas porque
usaba un objeto DataContext para toda la aplicacion,todas las consultas,
sorprendentemente,
si para cada funcion creo un objeto, si que me coge los cambios.

Hay una cosa que no me gusta mucho del LinqtoSQL y no se si por mi
desconocimiento, te cuento. Quiero actualizar un registro de la base de
datos vale?
Mi forma de trabajar es aislar el acceso a la base de datos, por lo que
bueno, mas o menos:
1. Recojo los datos (Select).
2. Muestro los datos.
3. Actualizo los datos.

Antes de usar Linq, para actualizar directamente llamaba a una funcion que
ejecutaba el "update", pero con Linq, tengo que hacer una consulta previa
para traer el registro que quiero actualizar, porque no puedes hacer como
antes "update. where clave=loquesea", y lo que no me gusta es eso
precisamente, el tener que hacer un select antes del update.

Hay alguna otra forma de hacerlo?

Muchas gracias.
Respuesta Responder a este mensaje
#3 Julian
29/09/2008 - 10:10 | Informe spam
// Siendo ctx. el DataContext
// el parametro query será la consulta que actualice "UPDATE . WHERE

// parameters = los parametros que tu deses para la consulta.
ctx..ExecuteQuery<T>(string query, params object[] parameters)

"[Juanjo]" escribió en el mensaje
news:
Gracias octavio:

El problema no es solo con un registro en concreto, creo que es mas porque
usaba un objeto DataContext para toda la aplicacion,todas las consultas,
sorprendentemente,
si para cada funcion creo un objeto, si que me coge los cambios.

Hay una cosa que no me gusta mucho del LinqtoSQL y no se si por mi
desconocimiento, te cuento. Quiero actualizar un registro de la base de
datos vale?
Mi forma de trabajar es aislar el acceso a la base de datos, por lo que
bueno, mas o menos:
1. Recojo los datos (Select).
2. Muestro los datos.
3. Actualizo los datos.

Antes de usar Linq, para actualizar directamente llamaba a una funcion que
ejecutaba el "update", pero con Linq, tengo que hacer una consulta previa
para traer el registro que quiero actualizar, porque no puedes hacer como
antes "update. where clave=loquesea", y lo que no me gusta es eso
precisamente, el tener que hacer un select antes del update.

Hay alguna otra forma de hacerlo?

Muchas gracias.



Respuesta Responder a este mensaje
#4 [Juanjo]
30/09/2008 - 13:11 | Informe spam
Gracias, ya sabia que podia ejecutar una instruccion sql.

La idea que yo tenia era aprovechar un poco mas el Ling,

Cuando recoges un registro de una tabla personas, por ejemplo:

var reg = (from persona where loquesea select lomismo);
persona p=reg.First();
p["nombre"]="otro Nombre";

// Siendo ctx. el DataContext
ctx.SubmitChanges(); //creo que era esta funcion

Ya actualiza el registro en cuestion.

El problema como comento es que si haces una funcion para recuperar la
persona, solo el select, y haces otra
para el Update, tienes que ejecutar una consulta para recuperar el registro
que quieres actualizar.

No se si me he explicado bien.


"Julian" escribió en el mensaje de noticias
news:
// Siendo ctx. el DataContext
// el parametro query será la consulta que actualice "UPDATE . WHERE

// parameters = los parametros que tu deses para la consulta.
ctx..ExecuteQuery<T>(string query, params object[] parameters)

"[Juanjo]" escribió en el mensaje
news:
Gracias octavio:

El problema no es solo con un registro en concreto, creo que es mas
porque usaba un objeto DataContext para toda la aplicacion,todas las
consultas, sorprendentemente,
si para cada funcion creo un objeto, si que me coge los cambios.

Hay una cosa que no me gusta mucho del LinqtoSQL y no se si por mi
desconocimiento, te cuento. Quiero actualizar un registro de la base de
datos vale?
Mi forma de trabajar es aislar el acceso a la base de datos, por lo que
bueno, mas o menos:
1. Recojo los datos (Select).
2. Muestro los datos.
3. Actualizo los datos.

Antes de usar Linq, para actualizar directamente llamaba a una funcion
que ejecutaba el "update", pero con Linq, tengo que hacer una consulta
previa para traer el registro que quiero actualizar, porque no puedes
hacer como antes "update. where clave=loquesea", y lo que no me gusta
es eso precisamente, el tener que hacer un select antes del update.

Hay alguna otra forma de hacerlo?

Muchas gracias.







Respuesta Responder a este mensaje
#5 Alfredo Novoa
30/09/2008 - 13:50 | Informe spam
Hola Juanjo,

El Tue, 30 Sep 2008 13:11:04 +0200, [Juanjo] escribió:

El problema como comento es que si haces una funcion para recuperar la
persona, solo el select, y haces otra
para el Update, tienes que ejecutar una consulta para recuperar el registro
que quieres actualizar.

No se si me he explicado bien.



Si, pero yo creo que si tienes que actualizar datos es mejor no usar Linq.
Está demasiado mal hecho.


Saludos
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida