linq linq-to-sql datacontext triggers submitchanges

Imitando el desencadenador de inserción SQL con LINQ-to-SQL



datacontext triggers (3)

El método Add solo establece un enlace entre los dos objetos: no marca el elemento agregado para su inserción en la base de datos. Para eso, necesita llamar InsertOnSubmit en la instancia Table<Child> contenida en su DataContext. El problema, por supuesto, es que no existe una forma innata de acceder a su DataContext desde el método que describe.

Usted tiene acceso a él implementando InsertParent en su DataContext, así que iría por esa ruta (y usar InsertOnSubmit lugar de Add , por supuesto).

EDITADO Supuse que el método parcial InsertParent sería llamado por DataContext en algún momento, pero al mirar mi propio código, ese método parece estar definido pero nunca referenciado por la clase generada. Entonces, ¿de qué sirve, me pregunto?

Usando LINQ-to-SQL, me gustaría crear automáticamente registros secundarios al insertar la entidad padre. Básicamente, imitar cómo funcionaría un desencadenador SQL Insert, pero en código para que se pueda realizar un procesamiento adicional.

El padre tiene una asociación con el niño, pero parece que no puedo simplemente agregar nuevos registros secundarios durante los SubmitChanges() de SubmitChanges() de DataContext SubmitChanges() .

Por ejemplo,

public partial class Parent { partial void OnValidate(System.Data.Linq.ChangeAction action) { if(action == System.Data.Linq.ChangeAction.Insert) { Child c = new Child(); ... set properties ... this.Childs.Add(c); } } }

Esto sería ideal, pero desafortunadamente el registro Child recién creado no se inserta en la base de datos. Tiene sentido, dado que el DataContext tiene una lista de objetos / enunciados y probablemente no le gusta que se agreguen nuevos elementos en el medio.

Del mismo modo, al interceptar la función partial void InsertParent(Parent instance) en el DataContext e intentar agregar el registro partial void InsertParent(Parent instance) obtiene el mismo resultado: sin errores, pero sin agregar nada a la base de datos.

¿Hay alguna manera de obtener este tipo de comportamiento sin agregar código a la capa de presentación?

Actualización: las OnValidate() y InsertParent() desde la función InsertParent() de DataContext. Sospecho que esta es la dificultad inherente a lo que estoy tratando de hacer: DataContext no permitirá que se inserten objetos adicionales (por ejemplo, mediante InsertOnSubmit() ) mientras está en el proceso de enviar los cambios existentes a la base de datos.

Idealmente, me gustaría mantener todo bajo una sola transacción, de modo que, si se produce algún error durante la inserción / actualización, no se cambie realmente nada en la base de datos. De ahí mis intentos de imitar la funcionalidad de SQL Trigger, permitiendo que los registros secundarios se inserten automáticamente a través de una única llamada a la función SubmitChanges() DataContext.


En linq a sql, usted hace un "disparador" haciendo una clase parcial al archivo dbml, y luego insertando un método parcial. Aquí hay un ejemplo que no haría nada porque llama a la eliminación incorporada.

partial void DeleteMyTable(MyTable instance) { //custom code here ExecuteDynamicDelete(instance); //or here :-) }


Si quieres que suceda justo antes de que se guarde; puede anular SubmitChanges y llamar a GetChangeSet() para obtener los cambios pendientes. Busque las cosas que le interesan (por ejemplo, delta.Inserts.OfType<Customer>() y realice los cambios necesarios.

Luego llame a base.SubmitChanges(...) .

Aquí hay un ejemplo relacionado , manejo de borrados.