C# 隐式linq到sql事务

C# 隐式linq到sql事务,c#,linq-to-sql,C#,Linq To Sql,我有两张桌子按1-1比例排列。比如: 单据:Id,序列号(Id为主键) Sub:Id,Name(Id是外键) 正如我提到的,文档Id和子文档Id是相关的1-1 现在在business objects中,我感觉数据类如下所示: DOC doc = new DOC(); doc.SN = 1; Sub sub = new Sub(); sub.Name = "name"; doc.Sub = sub; using(dbDataContext db = new dbDataContext()) {

我有两张桌子按1-1比例排列。比如:

单据:Id,序列号(Id为主键) Sub:Id,Name(Id是外键)

正如我提到的,文档Id和子文档Id是相关的1-1

现在在business objects中,我感觉数据类如下所示:

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()引发异常(无法插入对象已存在)

回到数据库,我发现这两个对象都是在执行该代码后插入的。

这是一个隐式事务还是我做错了什么

Linq2SQL正在第一次
SubmitChanges()上持久化对象图

i、 e

保存
doc
,及其子
doc.Sub

这与隐式事务无关,只是当父对象通过InsertOnSubmit()附加到datacontext时,L2SQL也自动附加其子对象

如果确实希望子项显式“插入”,则在文档的SubmitChanges()之后才将子项分配给文档(即插入带有空子项的文档)


一旦附加了DataContext,就很难从中删除对象。

您是否尝试过简单地删除第一次提交的更改,因此您的代码如下所示:

using(dbDataContext db = new dbDataContext())
{
  db.DOC.InsertOnSubmit(doc);
  sub.Id = doc.Id;
  db.Sub.InsertOnSubmit(sub);
  db.SubmitChanges();
}
我想问题是,在您第一次调用
SubmitChanges
后,文档仍然标记为已插入,而当您再次调用
SubmitChanges
时,它会给出错误,因为它已经存在于数据库中

DB上下文跟踪更改,因此您应该只调用一次
SubmitChanges

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