En utilisant SubmitChanges pour créer une opération de LINQ
-
26-10-2019 - |
Question
Alors, je suis en train de faire une transaction avec LINQ to SQL. Je lis que si je l'utilise SubmitChanges()
, cela créerait une transaction et d'exécuter tout et en cas de tout exception seraient annulées. Ai-je besoin d'utiliser SubmitChanges()
multiples? J'utilise quelque chose comme ce code et il ne fonctionne pas parce qu'il ne sauve pas de données sur la première table .. (je besoin de ID pour la table des enfants).
Si j'utiliser un autre droit de SubmitChanges()
après la première InsertOnSubmit
ne pas perdre l'idée d'une transaction?
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();
La solution
Le problème est que l'ID de votre processus est défini lorsque les modifications sont soumises à la base de données. Parce que vous soumettez les changements après la ligne où vous attribuez le numéro de processus au produit (product.Process_Id = openProcess.Id;
).
La bonne façon de le faire serait d'installer correctement votre base de données avec une clé étrangère du produit au PROCESS et utiliser la Process
propriété de navigation Product
pour affecter le processus au produit.
Le code ressemblerait à ceci:
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();
Parce que Process
est une propriété de navigation Product
, vous n'avez pas besoin d'insérer le Process
. Il sera inséré automatiquement, parce que vous insérez le « parent » -. Le Product
Autres conseils
Vous pouvez faire toute transaciotnal chose en utilisant un TransactionScope
par exemple.
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()
}
Si une exception est levée avant scope.Complete()
est appelée alors tout sera annulée.