Ja prosto ne mogu da vjerujem koliko je ovaj ADO.NET pun nekih 'caka'!!!
Gledaj, ono sto sam ti poslao radi, ali samo do odredjene mjere. Kada update-ujes added zapise master tabele, sa referencijalnim integritetom podesenim na cascade, povezani slave zapisi ce u foreignkey polju dobiti vrijednost primarnog kljuca aktivnog master zapisa, sto je ono sto ti trazis od pocetka.
Ali pazi sad! Kada odmah nakon update-a master zapisa odradis update slave zapisa, kojima si frisko podesio foreignkey na ispravnu vrijednost, ti slave zapisi nece otici do baze. Probaj, vidjeces.
Naime, Framework ce, nakon sto 'izvrsi' referecijalni integritet nad slave zapisima, podesiti DataRowState svojstvo tih slave zapisa na 'Unchanged'. ZASTO???
Kako to pravi probleme?
Pa, kada tableadapter radi Update on za svaki red ponasob na osnovu DataRowState svojstva generise po jednu komandu. Za 'Added' redove se generise INSERT komanda, za 'Modified' redove se generise 'UPDATE' komanda, za 'Deleted' redove se generise DELETE komanda, a 'Unchanged' redovi se NE RAZMATRAJU.
Dakle, posto odradimo update master zapisa (koji su prije update-a 'Added'), povezani slave zapisi ce promijeniti stanje sa 'Added' na 'Unchanged', i Framework NECE NI POKUSATI DA IH POSALJE BAZI!!! Sve ovo vazi SAMO ako je referencijalni integritet podesen na 'Cascade'. A ako nije, tek je onda muka.
Ne mogu da vjerujem da ovo do sada nisam znao!!!
Onda se mora naci nacin da nekako te sirocice posaljemo bazi. Nije mi jasno zasto uopste mijenjaju DataRowState svojstva redova nakon sprovodjenja referencijalnog integriteta. Medjutim, DataRow klasa ima metod SetAdded() koji se moze izvrsiti, zamislite, samo nad redom cije je stanje 'Unchanged'. Nagrdili pa popravili :)
Znaci, izmedju update-ovanja master i slave redova treba sve slave redove koji su bili 'Added' pa postali 'Unchanged' ponovo postaviti na 'Added' pomocu SetAdded() metode:
Code:
private void save1()
{
DataRow[] rows;
DataRow[] AddedMasterRows;
DataRow[] AddedSlaveRows;
rows = testDataSet.Slave.Select(null, null, DataViewRowState.Deleted);
if (rows != null) this.slaveTableAdapter.Update(rows);
rows = testDataSet.Master.Select(null, null, DataViewRowState.Deleted);
if (rows != null) this.masterTableAdapter.Update(rows);
AddedMasterRows = testDataSet.Master.Select(null, null, DataViewRowState.Added);
AddedSlaveRows = testDataSet.Slave.Select(null, null, DataViewRowState.Added);
if (AddedMasterRows != null) this.masterTableAdapter.Update(AddedMasterRows);
if (AddedSlaveRows != null)
{
foreach (TestDataSet.SlaveRow sr in testDataSet.Slave) if(sr.RowState == DataRowState.Unchanged) sr.SetAdded();
this.slaveTableAdapter.Update(AddedSlaveRows);
}
rows = testDataSet.Master.Select(null, null, DataViewRowState.ModifiedCurrent);
if (rows != null) this.masterTableAdapter.Update(rows);
rows = testDataSet.Slave.Select(null, null, DataViewRowState.ModifiedCurrent);
if (rows != null) this.slaveTableAdapter.Update(rows);
}
Ovo mi je pravilo probleme u proslosti, a da nisam ni znao...
Imas u attachmentu ispravljenu verziju ako te interesuje.
Pozdrav.
PS. Ne znam kako ti, ali ja sam zadovoljan rjesenjem tvog problema ;)