2009-08-25 14 views
6

Sto usando ADO.NET con un set di dati fortemente scritto in C# (.NET 3.5). Voglio inserire una nuova riga in due tabelle che sono correlate in una relazione 1: n.Inserimento di righe in relazione utilizzando un DataSet fortemente tipizzato

La tabella Attachments contiene la parte della chiave primaria della relazione e la tabella LicenseAttachments contiene la parte della chiave esterna.

AttachmentsDataSet.InvoiceRow invoice; // Set to a valid row, also referenced in InvoiceAttachments 
AttachmentsDataSet.AttachmentsRow attachment; 
attachment = attachmentsDataSet.Attachments.AddAttachmentsRow("Name", "Description"); 
attachmentsDataSet.InvoiceAttachments.AddInvoiceAttachmentsRow(invoice, attachment); 

Naturalmente quando ho aggiornare la tabella InvoicesAttachments, vado a prendere una violazione chiave esterna dal server SQL, così ho provato l'aggiornamento della tabella Attachments prima, che creerà le righe, ma sarà rimuovere l'allegato associazione nella tabella InvoiceAttachments. Perché?

Come posso risolvere questo problema?

+0

Solo una nota ... quando ho utilizzato set di dati fortemente tipizzati, ho ottenuto un enorme successo di prestazioni ogni volta che l'ho istanziato. – Zoidberg

+0

Sì, ne sono a conoscenza. Cosa usi invece? DataSet semplicemente digitati? –

+0

@Manuel: I tuoi dati fortemente tipizzati sono uguali a quelli che troverei nei miei set di dati del progetto asp.net, in quanto hai adotteri di tabella generati automaticamente o li stai creando manualmente? – Breadtruck

risposta

4

Sulla relazione tra i tavoli, assicurarsi che la "Sia Relation e Vincolo della chiave esterna" è selezionato e "Update Regola" è impostato su "Cascade". Combinato con l'opzione "Aggiorna la tabella di dati" sull'adattatore, dopo aver inserito la riga padre, l'ID aggiornato "abbassa" le relazioni, prevenendo le violazioni delle chiavi esterne nel set di dati. Le tabelle figlio saranno quindi pronte per l'inserimento corretto nel database.

1

Alcune cose da provare:

Quando si configura il TableAdapter, lo si fa clic su Opzioni avanzate e controllare sulla "tabella dei dati di aggiornamento", in modo che possa recuperare il valore colonna di identità?

Per me qualche volta ho dimenticato di controllarlo o non ha salvato la configurazione correttamente perché non avevo il mio incremento di identità di tabella/serie di semi per qualsiasi motivo. Stai usando l'incremento dell'identità sul tavolo?

Si potrebbe anche considerare di ricreare gli adattatori per queste due tabelle.

Di solito quando torno su tutto, trovo che sia qualcosa di stupido da parte mia.

Infine, è possibile prendere in considerazione la possibilità di chiamare l'aggiornamento nella tabella Primaria, quindi afferrare manualmente il valore della chiave primaria e impostare manualmente il valore quando si inserisce il record figlio. Se questo non ha senso fammelo sapere e inserirò il codice.

0

dovete dire tavolo adattatore del tabella padre per aggiornare la tabella dati dopo l'operazione di aggiornamento. Ecco come puoi farlo.

  1. Aprire le proprietà del ProgramUserGroupTableAdapter -> default Selezionare Query -> opzioni Advnaced. e Controllare l'opzione di Aggiornare la tabella di dati. Salva l'adattatore ora. Ora quando si chiama l'aggiornamento su adattatore da tavolo, la tabella di dati verrà aggiornata [aggiornata] dopo l'operazione di aggiornamento e rifletterà i valori più recenti dalla tabella del database. se la chiave principale o qualsiasi colonna è impostata su incremento automatico, la tabella di dati avrà l'ultimo aggiornamento post recente.

  2. Ora è possibile chiamare l'aggiornamento come pug.Update (dsUserGroup.ProgramUserGroup);

  3. Leggere gli ultimi valori dalle colonne del programma ProgramUserGroup e assegnare i rispettivi valori nella tabella figlio prima dell'aggiornamento. Funzionerà esattamente come vuoi tu.

alt text http://ruchitsurati.net/files/tds1.png

Problemi correlati