2009-02-25 16 views
8

Creé una base de datos .MDF en mi aplicación WPF.¿Por qué mis SubmitChanges() no funcionan en LINQ-to-SQL?

Luego generé clases LINQ-to-SQL y utilicé LINQ para obtener todos los clientes.

Luego reviso y cambio cada uno de sus apellidos.

Sin embargo, cuando llamo SubmitChanges, la base de datos permanece sin cambios.

Pensé que ese era el propósito de SubmitChanges(), para enviar cambios a la base de datos?

¿Qué me falta, cómo "enviar cambios" a mi base de datos?

public Window1() 
{ 
    InitializeComponent(); 

    Main2DataContext _db = new Main2DataContext(); 
    var customers = from c in _db.Customers 
        select c; 

    foreach (var customer in customers) 
    { 
     customer.LastName = "CHANGED lastname"; //ListBox shows changes 
    } 

    _db.SubmitChanges(); //does NOT save to database (???) 

} 
+2

Esta es una pregunta realmente tonta, pero tiene una clave principal en la tabla de clientes ¿no? –

+0

Sí: ID es clave principal, no permite valores NULL y la especificación de identidad se establece en IsIdentity = Yes. Creé el archivo .MDF con Visual Studio. –

Respuesta

15

Creo que sé cuál es el problema. ¿Estás usando un archivo .mdf local? Si ese es el caso, revisa tu carpeta bin/debug. Apuesto a que tienes una base de datos allí con los cambios. Creo que tiene un archivo .mdf en su proyecto que se copia a la carpeta bin/debug cada vez que compila. Por lo tanto, los cambios se guardan en la copia y no se ve reflejado en la copia que reside directamente en su proyecto.

+0

Acabo de pasar por esto y parece correcto. Adjunte a la copia bin/debug del MDF y verá los cambios. –

+0

bingo, eso fue todo! aprecio la tenacidad de todos –

+0

Solo lo sé porque he pasado horas persiguiendo esta misma cosa antes. Gald podría ayudarte. – Micah

2

Asegúrese de que su _db no se restablezca a un nuevo contexto en ningún momento entre la recuperación y el cambio, si es así, ese es el problema. También puede simplificar la asignación de su fuente de datos haciendo TheListBox.ItemsSource = _db.Customers;. Tengo muchos lugares en el código actual en los que estoy haciendo exactamente lo que describes y los cambios se están postulando bien. Una sugerencia adicional, configurar el inicio de sesión en su contexto (establezca el _db.Log en algún escritor, generalmente uso el Console.Out para poder ver los cambios en la ventana de resultados mientras se depura) para que pueda ver los cambios que realmente ocurren cuando llama al SubmitChanges().

+0

Pongo en _db.Log = Console.Out; antes de la línea submitchanges, no se muestra en mi ventana de salida, o ¿dónde se supone que debe salir? –

+0

ok, simplifiqué al máximo el código ahora, solo obtiene los objetos, los cambia y los guarda de nuevo con SubmitChanges, pero la base de datos aún no los cambia. ¿Alguna idea de por qué este es el caso? –

+0

¿Se está ejecutando en modo de depuración? Además, ¿tiene la opción "Redirigir todo el texto de la ventana de salida a la ventana Inmediato" marcada en Herramientas-> Opciones-> Depuración-> General? Si es así, su salida va a la ventana inmediata; de lo contrario, intente configurar su propio TextWriter alrededor de un StringBuilder y configure Log. –

Cuestiones relacionadas