我有两张表以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() 抛出异常(无法插入对象已存在)
回到数据库我发现在执行该代码后插入了两个对象 这是一个隐含的交易还是我做错了什么
答案 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
一次。