因此,我正在尝试与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;).

正确执行此操作的方法是,使用外国密钥正确设置您的数据库,从产品进行处理并使用导航属性 ProcessProduct 将过程分配给产品。

代码看起来像这样:

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() 被称为,然后整个东西将被回滚。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top