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();
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top