Set di dati fortemente tipizzato: inserimento di relazioni molti-a-molti
-
08-07-2019 - |
Domanda
Ho una relazione molti-a-molti in 3 tabelle: ProgramUserGroup e Feature sono le due tabelle principali e il collegamento tra loro è LinkFeatureWithProgramUserGroup , dove ho relazioni di chiave esterna con le due tabelle principali.
Ho un set di dati con inserti: voglio aggiungere una nuova riga a ProgramUserGroup e una funzionalità correlata (esistente) alla tabella LinkFeatureWithProgramUserGroup. Quando inserisco nuove righe, sto impostando l'id predefinito su -1:
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <DataSetUserGroup xmlns="http://tempuri.org/DataSetUserGroup.xsd">
<ProgramUserGroup diffgr:id="ProgramUserGroup1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
<id>-1</id>
<Name>99999999999</Name>
<Active>false</Active>
</ProgramUserGroup>
<LinkFeatureWithProgramUserGroup diffgr:id="LinkFeatureWithProgramUserGroup1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
<id>-1</id>
<Feature_id>7</Feature_id>
<ProgramUserGroup_id>-1</ProgramUserGroup_id>
</LinkFeatureWithProgramUserGroup> </DataSetUserGroup> </diffgr:diffgram>
durante l'aggiornamento delle tabelle, viene visualizzato un errore:
" L'istruzione INSERT era in conflitto con il vincolo FOREIGN KEY " FK-LinkFeatu-Progr-7DCDAAA2 " ;. Il conflitto si è verificato nel database " x " ;, tabella " dbo.ProgramUserGroup " ;, colonna "id". & Quot;
Il codice per l'aggiornamento è il seguente:
DataSetUserGroupTableAdapters.LinkFeatureWithProgramUserGroupTableAdapter lfa = new LinkFeatureWithProgramUserGroupTableAdapter();
DataSetUserGroupTableAdapters.ProgramUserGroupTableAdapter pug = new ProgramUserGroupTableAdapter();
pug.Update(dsUserGroup.ProgramUserGroup);
lfa.Update(dsUserGroup.LinkFeatureWithProgramUserGroup);
se controllo l'ID della nuova riga della tabella ProgramUserGroup, è stato aggiornato da -1 a @@ identità (come 1099), quindi va bene - inserisce la nuova riga.
Ma nella tabella LinkFeatureWithProgramUserGroup, il relativo valore ProgramUserGroup.ID è ancora -1, non è stato comunque aggiornato.
Come posso forzare anche l'aggiornamento delle chiavi della tabella dei collegamenti? Ho provato
pug.Update(dsUserGroup.ProgramUserGroup);
dsUserGroup.Merge(dsUserGroup.ProgramUserGroup);
lfa.Update(dsUserGroup.LinkFeatureWithProgramUserGroup);
Ma non ho risolto il problema :(
Grazie,
b.
Soluzione
Sì , c'è una soluzione per questo.
Devi aggiornare l'adattatore della tabella della tabella padre per aggiornare tabella dei dati dopo l'operazione di aggiornamento. Ecco come puoi farlo.
-
Apri le proprietà di ProgramUserGroupTableAdapter - > Query di selezione predefinita - > Opzioni avanzate . e seleziona l'opzione Aggiorna la tabella dei dati . Salva subito l'adattatore. Ora, quando si chiama update sull'adattatore della tabella, la tabella dei dati verrà aggiornata [aggiornata] dopo l'operazione di aggiornamento e rifletterà gli ultimi valori della tabella del database. se la chiave primaria o una qualsiasi colonna è impostata su auto-incremento, la tabella dei dati avrà l'ultimo valore dopo l'aggiornamento recente.
-
Ora puoi chiamare l'aggiornamento come pug.Update (dsUserGroup.ProgramUserGroup);
Leggi gli ultimi valori dalle colonne del ProgramUserGroup e assegna i rispettivi valori nella tabella figlio prima dell'aggiornamento . Funzionerà esattamente nel modo desiderato.