Pregunta

Tengo una base de datos MySQL, cuyo aspecto como esta estructura general:

Manufacturer <== ProbeDefinition <== ImagingSettings
  ElementSettings  ====^ ^==== ProbeInstance

Estoy usando InnoDB para permitir que las claves externas, y todas las claves externas que apuntan a un conjunto ProbeDefinition tener ON DELETE CASCADE.

El problema que estoy teniendo es cuando se borra un ProbeDefinition en mi código, que se vuelve a insertar inmediatamente. El borrado en cascada sucede propiamente se borran otras mesas, pero parece que el LINQ a SQL puede estar enviando una inserción sin ninguna razón. Comprobación de la propiedad de cambios en los programas de bases de datos 1 borrar, y no hay inserciones.

Estoy usando el siguiente pequeño fragmento de código para realizar el borrado:

database.ProbeDefinition.DeleteOnSubmit(probe);
database.SubmitChanges();

Registros en MySQL muestra los siguientes comandos se ejecutan cuando este es ejecutado:

BEGIN
use `wetscoprobes`; DELETE FROM wetscoprobes.probedefinition WHERE ID = 10
use `wetscoprobes`; INSERT INTO wetscoprobes.probedefinition (CenterFrequency, Elements, ID, IsPhased, ManufacturerID, Name, Pitch, Radius, ReverseElements) VALUES (9500000, 128, 10, 1, 6, 'Super Probe 2', 300, 0, 1) 
COMMIT /* xid=2424 */

Lo que podría causar este INSERT innecesario? Tenga en cuenta que la eliminación de un Manufacturer en la forma mismas exactas eliminaciones correctamente, con el siguiente registro:

BEGIN 
use `wetscoprobes`; DELETE FROM wetscoprobes.manufacturer WHERE ID = 9 
COMMIT /* xid=2668 */ 

Editar:. Una vez más pruebas, parece que esto sólo sucede después de haber llenado una ListBox con una lista de ProbeDefinitions

He intentado ejecutar el código anterior de eliminación antes y después del siguiente fragmento había corrido:

var manufacturer = (Manufacturer)cbxManufacturer.SelectedItem;
var probes = manufacturer.ProbeDefinition;

foreach (var probe in probes)
{
    cbxProbeModel.Items.Add(probe);
}

El objeto se elimina adecuadamente antes de que dicho código se ejecute, pero en cualquier momento después de este punto, se realiza una inserción después de la eliminación. ¿No es así como el hecho de que el objeto se hace referencia a alguna parte?

Este es el código que estoy corriendo a prueba de supresión de una definición de la ventana intermedia:

database.ProbeDefinition.DeleteOnSubmit(database.ProbeDefinition.Last())
database.SubmitChanges()
¿Fue útil?

Solución

Resulta que hay problemas cuando hay múltiples referencias a su objeto. Pasando a través de la fuente DbLinq, supe que después de que se complete una DELETE, se guía a través de todos los demás objetos "vistos", en busca de referencias.

En este caso, tengo varias referencias a través de la database.ProbeDefinition mesa, así como a través de la referencia del fabricante, manufacturer.ProbeDefinition. Este no es un problema hasta que haya accedido a objetos a través de ambos métodos. Usando Remove puede suprimir la referencia del fabricante, utilizando DeleteOnSubmit se eliminará el objeto de la mesa. Si hago una o la otra, todavía existe la otra referencia, y por lo tanto el objeto está marcado para ser reinsertado. No estoy seguro si esto es un error en DbLinq que no elimina otras referencias, o comportamiento esperado.

De cualquier manera, en mi caso, la solución es o bien el acceso de la mesa utilizando un solo método, y eliminar el uso de ese método, o eliminar el uso de ambos métodos. En aras de conseguir que funcione, he usado el segundo método:

// Delete probe
this.manufacturer.ProbeDefinition.Remove(probe);
database.ProbeDefinition.DeleteOnSubmit(probe);
database.SubmitChanges();

EDIT: Al seguir trabajando en el proyecto y cuestiones similares, he encontrado la verdadera cuestión de fondo de mi aplicación. Tengo un DataContext vivido largo, y con la forma en caché de las obras (para hacer el trabajo SubmitChanges), no se puede hacer esto. El real solución es tener una corta vida DataContext y vuelva a conectar a la base de datos en cada método.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top