Linq Transaktion

20/06/2008 - 17:02 von Holger Kreissl | Report spam
Hallo,

ich versuche gerade einige DB Inserts auf mehrere Tabellen, die alle in
Foreign Key Abhàngigkeit stehen, durchzuführen.

Nun wàre es sinnvoll, das Ganze als Transaktion ablaufen zu lassen. Da
ich neu in LINQ bin die Frage, in wie fern sich linq selbst darum
kümmert und ob es überhaupt so ohne weiteres möglich ist.

Wenn ja, wie setzt man z.B. den Foreign Key wenn dieser ein
Autoinkrement PK ist oder wird das durch LINQ behandelt?

Wenn ich es auf normalem Weg versuche, wird die Autoinkrement ID erst
nach SubmitChanges gesetzt und dann ist der Spaß ja schon in der DB
commited..

Für ein paar Tips wàre ich sehr dankbar.

Gruß,
Holger


Holger Kreissl
.NET Software Developer
http://kreissl.blogspot.com/
 

Lesen sie die antworten

#1 Elmar Boye
20/06/2008 - 19:35 | Warnen spam
Hallo Holger,

Holger Kreissl schrieb:
ich versuche gerade einige DB Inserts auf mehrere Tabellen, die alle in
Foreign Key Abhàngigkeit stehen, durchzuführen.

Nun wàre es sinnvoll, das Ganze als Transaktion ablaufen zu lassen. Da
ich neu in LINQ bin die Frage, in wie fern sich linq selbst darum
kümmert und ob es überhaupt so ohne weiteres möglich ist.



Der DataContext eröffnet bei SubmitChanges eine Transaktion.
Wenn Du das selbst steuern willst, so kannst Du auch selbst
einen TransactionScope verwenden oder eine Transaction erstellen:
<URL:http://msdn.microsoft.com/de-de/lib...5.aspx>
"Transaktionen (LINQ to SQL)"
Einige Variationen dazu zeigt auch:
<URL:http://msdn.microsoft.com/en-us/lib...2.aspx>
"LINQ to SQL: .NET Language-Integrated Query for Relational Data"

Wenn ja, wie setzt man z.B. den Foreign Key wenn dieser ein
Autoinkrement PK ist oder wird das durch LINQ behandelt?



Linq erstellt zunàchst ein ChangeSet mit allen durchzuführenden
Änderungen, ermittelt anhand der Assoziationen die Abhàngigkeiten
und fügt die Primàrschlüssel-Kandidaten zuerst ein, so dass sie
bei den Fremdschlüsseln verwendet werden können. Siehe
<URL:http://msdn.microsoft.com/de-de/lib...2.aspx>
"Objektzustànde und Änderungsverfolgung (LINQ to SQL)"

(Beachte das dies nicht fürs Löschen gilt, wie dort nachzulesen)

Wenn ich es auf normalem Weg versuche, wird die Autoinkrement ID erst
nach SubmitChanges gesetzt und dann ist der Spaß ja schon in der DB
commited..



Autowerte stehen immer erst nach dem Einfügen zur Verfügung,
da sie von der Datenbank erzeugt werden. Und Du siehst sie somit
erst danach.
Sie werden wàhrend des SubmitChanges nach dem Einfügen abgerufen
(d. h. es gilt IsDbGenerated = True für die Spalte).
Ähnliches passiert mit Spalten, für die AutoSync oder IsVersion
gesetzt ist.

Verfolgen kannst Du den Vorgang gut im SQL Server Profiler.
Und die Linq Interna via ChangeSet:
<URL:http://msdn.microsoft.com/de-de/lib...0.aspx>
"Gewusst wie: Anzeigen eines ChangeSet (LINQ to SQL)"

Gruß Elmar

Ähnliche fragen