質問

だから、私は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() その後、全体がロールバックされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top