【问题标题】:How to rollback transaction using LINQ-to-SQL in entity framework?如何在实体框架中使用 LINQ-to-SQL 回滚事务?
【发布时间】:2017-10-08 07:30:44
【问题描述】:

这是我的代码:

TransactionScope trans = new TransactionScope();
dbDataContext db = new dbDataContext()
// did some insert
var user = new User();
user.ID = 1;
user.Name = "Nick";

db.Users.Add(user);

db.SubmitChanges();
trans.Complete();

现在如果在保存更改时发生错误,我该如何回滚事务?

【问题讨论】:

  • db.SubmitChanges(); 到底是什么意思? dbDataContext的定义是什么?
  • 任一您正在使用 Linq-to-SQL(C# 团队构建的 ORM 作为概念验证 - 仅针对 SQL Server 运行,使用 @987654324 @model 文件)-或者您正在使用 Entity Framework,这是另一个 ORM,由 Microsoft 的 ADO.NET 团队构建,它支持多个数据库以及基于模型和代码的方法 - 您不能同时使用两者。那么它是哪一个??

标签: c# entity-framework linq transactions


【解决方案1】:

您可以通过两种方式在实体框架中使用事务。一个使用 TransactionScope,另一个使用数据库事务。

要使用数据库事务,请使用以下代码示例:

using (dbDataContext db = new dbDataContext())
using (var dbContextTransaction = db.Database.BeginTransaction()) 
{
    try
    { 
        var user = new User(){ID = 1, Name = "Nick"};
        db.Users.Add(user);
        db.SaveChanges();
        dbContextTransaction.Commit(); 
    } 
    catch (Exception) 
    { 
        dbContextTransaction.Rollback(); 
    }
} 

下面是一个 EF 的 TransactionScope 示例:

using (TransactionScope tranScope = new TransactionScope())
using (dbDataContext db = new dbDataContext())
{
    try
    {
        var user = new User(){ID = 1, Name = "Nick"};
        db.Users.Add(user);
        db.SaveChanges();
        tranScope.Complete();
    }
    catch(Exception ex){}
}

如您所见,在 TransactionScope 的情况下,您不需要调用任何 Roll-Back 方法。如果您不调用 Complete() 方法,则事务不会被提交并在被释放前自动回滚。

【讨论】:

  • 谢谢!!我是实体框架的新手.. 这很有帮助.. :)
  • 那段代码还能编译吗?请检查并更正。
  • @MKR 以上代码仅供参考。
  • @chaosifier 我怀疑SubmitChanges 函数调用。我错过了什么吗?
猜你喜欢
  • 2010-09-05
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2010-12-17
  • 2014-11-13
  • 1970-01-01
相关资源
最近更新 更多