3

所以,我正在尝试使用 LINQ to SQL 进行交易。我读到,如果我使用SubmitChanges(),它将创建一个事务并执行所有内容,如果出现异常,所有内容都会回滚。我需要使用 MULTIPLESubmitChanges()吗?我正在使用类似此代码的代码,但它不起作用,因为它没有在第一个表上保存任何数据..(我需要它的子表 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();
4

2 回答 2

5

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()那么整个事情将被回滚。

于 2011-09-05T15:44:02.293 回答
1

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

正确的方法是使用从 PRODUCT 到 PROCESS 的外键正确设置数据库,并使用导航属性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.

于 2011-09-05T15:46:40.733 回答