Utilizzando LINQ-to-SQL, vorrei creare automaticamente record figlio quando si inserisce l'entità padre. Fondamentalmente, imitando il modo in cui un trigger di inserimento SQL funzionerebbe, ma in-code in modo che si possa eseguire qualche ulteriore elaborazione.Mimando SQL Insert Trigger con LINQ-to-SQL
Il genitore ha un'associazione con il figlio, ma sembra che non possa semplicemente aggiungere nuovi record figlio durante lo SubmitChanges()
del DataContext.
Per esempio,
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);
}
}
}
Questo sarebbe l'ideale, ma purtroppo la recente creazione Child
record non viene inserito nel database. Ha senso, dal momento che DataContext ha una lista di oggetti/dichiarazioni e probabilmente non gli piacciono i nuovi oggetti aggiunti nel mezzo di esso.
Analogamente, l'intercettazione della funzione partial void InsertParent(Parent instance)
nel DataContext e il tentativo di aggiungere il record Child
produce lo stesso risultato: nessun errore, ma nulla aggiunto al database.
C'è un modo per ottenere questo tipo di comportamento senza aggiungere codice al livello di presentazione?
Aggiornamento: Sia i OnValidate()
e InsertParent()
funzioni sono chiamate dalla funzione del DataContext SubmitChanges()
. Sospetto che questa sia la difficoltà intrinseca di ciò che sto cercando di fare: DataContext non consentirà l'inserimento di oggetti aggiuntivi (ad esempio tramite InsertOnSubmit()
) mentre è in corso l'invio delle modifiche esistenti al database.
Idealmente mi piacerebbe mantenere tutto sotto una Transazione in modo che, se si verificano errori durante l'inserimento/aggiornamento, nulla è effettivamente cambiato nel database. Da qui i miei tentativi di imitare la funzionalità SQL Trigger, che consente di inserire automaticamente i record figlio attraverso una singola chiamata alla funzione SubmitChanges()
di DataContext.
Marc - grazie mille. Questo è esattamente quello che stavo cercando e funziona perfettamente! – BrandonB
Marc, questo (e il tuo link correlato) è un ottimo suggerimento ed è stato molto utile anche a me, grazie! – Funka