Verwenden von Submitchanges zum Erstellen einer linq -Transaktion
-
26-10-2019 - |
Frage
Also versuche ich, eine Transaktion mit Linq zu SQL durchzuführen. Ich habe das gelesen, wenn ich benutze SubmitChanges()
, Es würde eine Transaktion erzeugen und alles ausführen und in einer Ausnahme alles zurückgerollt werden. Muss ich mehrere verwenden? SubmitChanges()
? Ich benutze so etwas wie diesen Code und es funktioniert nicht, da er keine Daten in der ersten Tabelle speichert. (Ich brauche die ID für die Kindertabelle).
Wenn ich einen anderen benutze SubmitChanges()
direkt nach dem ersten InsertOnSubmit
Verliert es nicht die Idee einer Transaktion?
myDataContext db = new myDataContext();
Process openProcess = new Process();
openProcess.Creation = DateTime.Now;
openProcess.Number = pNumber;
//Set to insert
db.Process.InsertOnSubmit(openProcess);
Product product = new Product();
product.Code = pCode;
product.Name = pName;
product.Process_Id = openProcess.Id;
//Submit all changes at once?
db.SubmitChanges();
Lösung
Das Problem ist, dass die ID Ihres Prozesses festgelegt wird, wenn die Änderungen an die Datenbank übermittelt werden. Da Sie die Änderungen nach der Zeile einreichen, in der Sie die Prozess -ID dem Produkt zuweisen (product.Process_Id = openProcess.Id;
).
Die richtige Möglichkeit, dies zu tun Process
an Product
Um den Prozess dem Produkt zuzuweisen.
Der Code würde so aussehen:
myDataContext db = new myDataContext();
Process openProcess = new Process();
openProcess.Creation = DateTime.Now;
openProcess.Number = pNumber;
Product product = new Product();
product.Code = pCode;
product.Name = pName;
product.Process = openProcess;
db.Product.InsertOnSubmit(product);
db.SubmitChanges();
Da Process
ist ein Navigationseigentum von Product
, Sie müssen die nicht einfügen Process
. Es wird automatisch eingefügt, da Sie das "Elternteil" einfügen - die Product
.
Andere Tipps
Sie können das Ganze mit a transaciotnal machen TransactionScope
z.B
using (TransactionScope scope = new TransactionScope())
{
myDataContext db = new myDataContext();
Process openProcess = new Process();
openProcess.Creation = DateTime.Now;
openProcess.Number = pNumber;
db.Process.InsertOnSubmit(openProcess);
db.SubmitChanges();
//openProcess.Id will be populated
Product product = new Product();
product.Code = pCode;
product.Name = pName;
product.Process_Id = openProcess.Id;
db.Products.InsertOnSubmit(product); // I assume you missed this step in your example
db.SubmitChanges();
scope.Complete()
}
Wenn eine Ausnahme zuvor ausgelöst wird scope.Complete()
wird genannt, dann wird das Ganze zurückgerollt.