C# 隐式linq到sql事务
我有两张桌子按1-1比例排列。比如: 单据:Id,序列号(Id为主键) Sub:Id,Name(Id是外键) 正如我提到的,文档Id和子文档Id是相关的1-1 现在在business objects中,我感觉数据类如下所示: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()) {
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();
}