使用SubmitChanges创建LINQ事务
本文关键字:事务 LINQ 创建 SubmitChanges 使用 | 更新日期: 2023-09-27 18:07:44
所以,我试图与LINQ到SQL进行交易。我读到,如果我使用SubmitChanges()
,它将创建一个事务并执行所有内容,并且在发生异常的情况下,所有内容都将回滚。我需要使用多个SubmitChanges()
吗?我正在使用像这样的代码,它不工作,因为它没有保存任何数据在第一个表..(我需要它的ID为孩子表)。
如果我在第一个InsertOnSubmit
之后使用另一个SubmitChanges()
,它不会失去事务的想法吗?
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();
您可以使用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()
之前抛出异常,则整个操作将被回滚。
问题是,进程的ID是在将更改提交给数据库时设置的。因为您在将流程id分配给产品(product.Process_Id = openProcess.Id;
)的行之后提交更改。
正确的方法是使用一个从PRODUCT到PROCESS的外键正确设置数据库,并在Product
上使用导航属性Process
将进程分配给产品。
代码应该是这样的:
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();
因为Process
是Product
的导航属性,所以不需要插入Process
。它会自动插入,因为你插入了"父" - Product
.