使用subbitchanges创建LINQ事务
-
26-10-2019 - |
题
因此,我正在尝试与LINQ到SQL进行交易。我读过,如果我使用 SubmitChanges()
, ,它将创建交易并执行所有内容,并在例外,一切都会回滚。我需要使用多个 SubmitChanges()
?我正在使用类似此代码的东西,并且它不起作用,因为它没有在第一张表上保存任何数据。
如果我确实使用另一个 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();
解决方案
问题是,当更改提交到数据库时,设置了过程的ID。因为您在将流程ID分配给产品的行之后提交更改(product.Process_Id = openProcess.Id;
).
正确执行此操作的方法是,使用外国密钥正确设置您的数据库,从产品进行处理并使用导航属性 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();
因为 Process
是一个导航属性 Product
, ,您不需要插入 Process
. 。它将自动插入,因为您插入“父” - Product
.
其他提示
您可以使用一个 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()
被称为,然后整个东西将被回滚。
不隶属于 StackOverflow