Κατ' αρχήν μην ξαναχρησιμοποιήσεις CommandBuilder (παρά μόνο αφού εξοικειωθείς αρκετά με το ADO.NET και καταλάβεις τι ακριβώς κάνει και τι ΔΕΝ κάνει)!
Το πρόβλημά σου οφείλεται ακριβώς στη χρήση του CommandBuilder. Όταν δημιουργείς τους TableAdapters μέσω του Wizard, τότε όταν δημιουργεί το κάθε Insert και Update command, στο CommandText property που έχουν, μετά από κάθε INSERT και UPDATE statement κολλάει και ένα SELECT statement που έχει σκοπό να κάνει refresh στα data καθώς πολλές φορές άλλα ξεκινάμε να γράψουμε σε έναν πίνακα και άλλα περιέχει στο τέλος (λόγω identities, defaults, triggers, κλπ). Αν το κάθε Insert command σου είχε αυτό το ζευγάρι INSERT/SELECT τότε θα έπαιρνες πίσω την τιμή του identity που πραγματικά μπήκε στη βάση και κατόπιν δεν θα χρειάζονταν να κάνεις τίποτα το ιδιαίτερο για να κάνεις insert τις detail εγγραφές. Θα περιείχαν ήδη το σωστό identity. Όμως το statement που φτιάχνει ο CommandBuilder ΔΕΝ περιέχει αυτό το SELECT μετά το INSERT ή το UPDATE γιατί δεν προορίζεται γι αυτή τη δουλειά καθώς είναι μια quick'n'dirty λύση. Φτιάξε τους TableAdapters με τον Wizard και διάβασε προσεχτικά τον παραγόμενο κώδικα για να καταλάβεις πως λειτουργεί.
Επειδή έχουμε ξανακουβεντιάσει αυτό το πρόβλημα, θα σου πρότεινα, αφού δουλέψεις με τον Wizard, να δεις για περισσότερα στα παρακάτω:
http://msdn2.microsoft.com/en-us/library/ms971502.aspx
http://www.dotnetzone.gr/cs/forums/16421/ShowPost.aspx (και επειδή είναι μακρύ το thread, δες ειδικότερα:
http://www.dotnetzone.gr/cs/forums/permalink/16421/16525/ShowThread.aspx#16525)
http://www.dotnetzone.gr/cs/forums/3427/ShowPost.aspx
http://www.dotnetzone.gr/cs/forums/8901/ShowPost.aspx
Vir prudens non contra ventum mingit