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();
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top