Submitchangesを使用してLINQトランザクションを作成します
-
26-10-2019 - |
質問
だから、私はLINQとSQLへのトランザクションを作成しようとしています。使用すると読みました SubmitChanges()
, 、それはトランザクションを作成してすべてを実行し、例外の場合にすべてがロールバックされます。複数を使用する必要がありますか? SubmitChanges()
?私はこのコードのようなものを使用していますが、最初のテーブルにデータを保存していないため、機能していません。(子供のテーブルにIDが必要です)。
別のものを使用する場合 SubmitChanges()
最初の直後 InsertOnSubmit
取引のアイデアを失いませんか?
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();
解決
問題は、変更がデータベースに提出されたときにプロセスのIDが設定されることです。プロセスIDを製品に割り当てる行の後に変更を送信するため(product.Process_Id = openProcess.Id;
).
これを行う正しい方法は、製品からナビゲーションプロパティを処理して使用する外部キーでデータベースを正しくセットアップすることです。 Process
の上 Product
プロセスを製品に割り当てる。
コードは次のようになります:
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();
なぜなら Process
のナビゲーションプロパティです Product
, 、挿入する必要はありません Process
. 。 「親」を挿入するため、自動的に挿入されます - Product
.
他のヒント
aを使用して、全体をトランスアキトナルにすることができます TransactionScope
例えば
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()
}
以前に例外がスローされている場合 scope.Complete()
その後、全体がロールバックされます。
所属していません StackOverflow