【问题标题】:Using SubmitChanges to create a LINQ Transaction使用 SubmitChanges 创建 LINQ 事务
【发布时间】:2011-09-05 15:31:49
【问题描述】:

所以,我正在尝试使用 LINQ to 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();

【问题讨论】:

    标签: c# linq linq-to-sql transactions submitchanges


    【解决方案1】:

    您可以使用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() 之前抛出异常,那么整个事情将被回滚。

    【讨论】:

    • Products.Add(product) 和 Products.InsertOnSubtmit(product) 有什么区别?
    【解决方案2】:

    问题是,您的进程 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();
    

    因为ProcessProduct 的导航属性,所以不需要插入Process。它将自动插入,因为您插入了“父级” - Product

    【讨论】:

    • 其实数据库已经这样设计了。这是一个非常好的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    相关资源
    最近更新 更多