隐式linq到sql事务

时间:2012-09-12 09:31:36

标签: c# linq-to-sql

我有两张表以1比1实现。类似的东西:

  

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

回到数据库我发现在执行该代码后插入了两个对象 这是一个隐含的交易还是我做错了什么

2 个答案:

答案 0 :(得分:1)

Linq2SQL在第一个SubmitChanges()

上持久保存对象图

即。

db.DOC.InsertOnSubmit(doc);

保存doc及其子doc.Sub

这与隐式事务无关,只是当使用InsertOnSubmit()将Parent附加到datacontext时,L2SQL也会自动附加其子项。

如果你确实想要Sub的显式“插入”,那么在Doc的SubmitChanges()之后不要将Sub分配给Doc(即插入带有null Sub的doc)。

一旦附加了DataContext的manually detach对象就很难了。

答案 1 :(得分:1)

您是否尝试过删除第一个SubmitChanges,因此您的代码如下所示:

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

我想问题是,在您第一次SubmitChanges调用后,文档仍然标记为已插入,当您再次调用SubmitChanges时,它会出现错误,因为它已存在于数据库中。

数据库上下文跟踪更改,因此您应该只调用SubmitChanges一次。