1

私は 1 - 1 realtion によって realted 2 つのテーブルを持っています。何かのようなもの:

DOC: Id,SN (Id は主キー) Sub: Id,Name (Id は外部キー)

DOC.Id と Sub.Id は、前述のように 1 - 1 で関連付けられています

ビジネスオブジェクトでは、次のようにデータクラスを感じています:

DOC doc = new DOC();
doc.SN = 1;
Sub sub = new Sub();
sub.Name = "name";
doc.Sub = sub;

using(dbDataContext db = new dbDataContext())
{
   db.DOC.InsertOnSubmit(doc);
   db.SubmitChanges();
   sub.Id = doc.Id;
   db.Sub.InsertOnSubmit(sub);
   db.SubmitChanges();
}

最後のSubmitChanges()は例外をスローします (オブジェクトが既に存在するため挿入できません)

データベースに戻ると、そのコードを実行した後に両方のオブジェクトが挿入されていることがわかりました。
それは暗黙のトランザクションですか、それとも何か間違ったことをしていますか

4

2 に答える 2

1

Linq2SQL は、最初のオブジェクト グラフを保持しています。SubmitChanges()

すなわち

db.DOC.InsertOnSubmit(doc);

docとその子を保存しますdoc.Sub

これは暗黙的なトランザクションとは関係ありません。Parent が InsertOnSubmit() で datacontext にアタッチされると、L2SQL はその子も自動的にアタッチします。

Sub の明示的な「挿入」が必要な場合は、Doc の SubmitChanges() の後まで Sub を Doc に割り当てないでください (つまり、null Sub でドキュメントを挿入します)。

一度アタッチされた DataContext からオブジェクトを手動でデタッチすることは非常に困難です。

于 2012-09-12T09:34:09.850 に答える
1

最初の SubmitChanges を単純に削除しようとしたので、コードは次のようになります。

using(dbDataContext db = new dbDataContext())
{
  db.DOC.InsertOnSubmit(doc);
  sub.Id = doc.Id;
  db.Sub.InsertOnSubmit(sub);
  db.SubmitChanges();
}

問題は、最初のSubmitChanges呼び出しの後、ドキュメントがまだ挿入済みとしてマークされており、SubmitChanges再度呼び出すと、データベースに既に存在するためエラーが発生することだと思います。

DB コンテキストは変更を追跡するので、実際には 1 回だけ呼び出す必要がありますSubmitChanges

于 2012-09-12T09:34:33.233 に答える