1

我有两张桌子,由 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()抛出异常(can't insert object is already exists)

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

4

2 回答 2

1

Linq2SQL 在第一个持久化对象图SubmitChanges()

IE

db.DOC.InsertOnSubmit(doc);

保存doc和它的孩子doc.Sub

这与隐式事务无关,只是当使用 InsertOnSubmit() 将父级附加到数据上下文时,L2SQL 也会自动附加其子级。

如果您确实想要为 Sub 显式“插入”,则不要将 Sub 分配给 Doc,直到 Doc 的 SubmitChanges() 之后(即插入带有 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再次调用时,它会给出错误,因为它已经存在于数据库中。

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

于 2012-09-12T09:34:33.233 回答