使用SubmitChanges创建LINQ事务

时间:2011-09-05 15:31:49

标签: c# linq linq-to-sql transactions submitchanges

所以,我正在尝试使用LINQ to SQL进行事务处理。我读到如果我使用SubmitChanges(),它将创建一个事务并执行所有内容,并且在异常的情况下,所有内容都将被回滚。我需要使用MULTIPLE SubmitChanges()吗?我正在使用类似这样的代码并且它无法工作,因为它没有在第一个表上保存任何数据..(我需要它为子表的ID)。

如果我在第一个SubmitChanges()之后立即使用其他InsertOnSubmit,那么它会失去交易的想法吗?

myDataContext db = new myDataContext();

Process openProcess = new Process();

openProcess.Creation = DateTime.Now;
openProcess.Number = pNumber;

//Set to insert

db.Process.InsertOnSubmit(openProcess);

Product product = new Product();

product.Code = pCode;
product.Name = pName;
product.Process_Id = openProcess.Id;

//Submit all changes at once?

db.SubmitChanges();

2 个答案:

答案 0 :(得分:3)

你可以使用TransactionScope例如

来完成整个事务
using (TransactionScope scope = new TransactionScope())
{
myDataContext db = new myDataContext();

Process openProcess = new Process();

openProcess.Creation = DateTime.Now;
openProcess.Number = pNumber;



db.Process.InsertOnSubmit(openProcess);
db.SubmitChanges();
//openProcess.Id will be populated

Product product = new Product();

product.Code = pCode;
product.Name = pName;
product.Process_Id = openProcess.Id;    

db.Products.InsertOnSubmit(product); // I assume you missed this step in your example
db.SubmitChanges();

scope.Complete()
}

如果在调用scope.Complete()之前抛出异常,则整个事件将被回滚。

答案 1 :(得分:1)

问题是,当将更改提交到数据库时,会设置进程的ID。因为您在将流程ID分配给产品的行(product.Process_Id = openProcess.Id;)之后提交了更改。

执行此操作的正确方法是使用从PRODUCT到PROCESS的外键正确设置数据库,并使用Process上的导航属性Product将流程分配给产品。

代码如下所示:

myDataContext db = new myDataContext();

Process openProcess = new Process();

openProcess.Creation = DateTime.Now;
openProcess.Number = pNumber;

Product product = new Product();

product.Code = pCode;
product.Name = pName;
product.Process = openProcess;

db.Product.InsertOnSubmit(product);
db.SubmitChanges();

由于ProcessProduct的导航属性,因此您无需插入Process。它会自动插入,因为您插入了“父” - Product