3

そこで、LINQ to SQL でトランザクションを作成しようとしています。SubmitChanges()を使用すると、トランザクションが作成されてすべてが実行され、例外が発生した場合はすべてがロールバックされることを読みました。MULTIPLE を使用する必要があります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();
4

2 に答える 2

5

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()、すべてがロールバックされます。

于 2011-09-05T15:44:02.293 に答える
1

問題は、変更がデータベースに送信されるときにプロセスの ID が設定されることです。プロセス ID を製品に割り当てる行の後に変更を送信するためです ( product.Process_Id = openProcess.Id;)。

これを行う正しい方法は、PRODUCT から PROCESS への外部キーを使用してデータベースを正しくセットアップし、ナビゲーション プロパティを使用してプロセスを製品ProcessProduct割り当てることです。

コードは次のようになります。

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

于 2011-09-05T15:46:40.733 に答える