首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SubmitChanges创建LINQ事务

使用SubmitChanges创建LINQ事务
EN

Stack Overflow用户
提问于 2011-09-05 23:31:49
回答 2查看 5K关注 0票数 3

因此,我正在尝试使用LINQ to SQL进行事务处理。我读到,如果我使用SubmitChanges(),它将创建一个事务并执行所有内容,如果发生异常,所有内容都将回滚。是否需要使用多个SubmitChanges()?我正在使用类似于此代码的代码,但它无法工作,因为它没有保存第一个表中的任何数据。(我需要它的ID作为子表)。

如果我在第一个InsertOnSubmit之后立即使用另一个SubmitChanges(),它不会失去事务的概念吗?

代码语言:javascript
复制
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();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-05 23:46:41

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

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

代码将如下所示:

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2011-09-05 23:44:02

你可以使用TransactionScope使整个事情变得透明。

代码语言:javascript
复制
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()之前抛出异常,那么整个事件将被回滚。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7310084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档