Al usar LINQ-to-SQL, me gustaría crear automáticamente registros secundarios al insertar la entidad principal. Básicamente, imitar cómo funcionaría un desencadenador SQL Insert, pero en código para que se pueda realizar un procesamiento adicional.Imitando el desencadenador de inserción de SQL con LINQ-to-SQL
El elemento primario tiene una asociación con el elemento secundario, pero parece que no puedo simplemente agregar registros secundarios nuevos durante el 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 lo ideal, pero por desgracia, el recién creado Child
registro 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.
De forma similar, al interceptar la función partial void InsertParent(Parent instance)
en el DataContext e intentar agregar el registro Child
, se 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: Tanto los OnValidate()
y InsertParent()
se abren desde la función de la DataContext SubmitChanges()
. Sospecho que esta es la dificultad inherente a lo que estoy tratando de hacer: DataContext no permitirá la inserción de objetos adicionales (por ejemplo, a través del InsertOnSubmit()
) mientras está en el proceso de enviar los cambios existentes a la base de datos.
Idealmente, me gustaría mantener todo bajo una transacción para que, si se produce algún error durante la inserción/actualización, nada realmente se cambia en la base de datos. De ahí mis intentos de imitar la funcionalidad del Trigger SQL, permitiendo que los registros secundarios se inserten automáticamente a través de una única llamada a la función SubmitChanges()
de DataContext.
Marc - muchas gracias. ¡Eso es exactamente lo que estaba buscando y funciona perfectamente! – BrandonB
Marc, este (y su enlace relacionado) es una sugerencia excelente y también fue muy útil para mí, ¡gracias! – Funka