为了账号安全,请及时绑定邮箱和手机立即绑定

数据库上下文保存(如果有效)

数据库上下文保存(如果有效)

C#
凤凰求蛊 2022-06-12 14:32:17
我对实体框架有疑问。在我的程序中,我首先用数据填充我的 DbContext。然后我需要从数据库中的表中删除所有数据,但前提是要保存新数据。如果 db.Savechanges() 引发异常,我需要我的旧数据仍在表中。我的代码是:static void Main(string[] args)        {            PdmContext db = new PdmContext();            FillDbContext();            try            {                if (db.SaveChanges() > 0)                {                    using (var del = new PdmContext())                    {                        DeleteModel.deleteFromAllTables();                    }                    db.SaveChanges();                }            }            catch (Exception exp)            {                Logger.Log("Exception (global catch));            }        }我似乎无法弄清楚这一点。任何人都可以帮助解决这个问题吗?:)
查看完整描述

3 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

如果操作在某个阶段失败,您可以使用Transactionwhich 确保恢复在其范围内完成的操作:


using (var scope = new TransactionScope(TransactionScopeOption.Required))

{

      using (var del = new PdmContext())

      {

          DeleteModel.deleteFromAllTables();

      }

      db.SaveChanges();


      scope.Complete();  // commits the transaction     

}

现在对数据库的更改将是原子的,因此它只会保留所有更改或根本不保留。为简单起见,我没有包含异常处理代码,但由于任何原因,如果scope.Complete()没有执行并且控制存在事务块而不执行,则事务将回滚。


查看完整回答
反对 回复 2022-06-12
?
千巷猫影

TA贡献1829条经验 获得超7个赞

您需要使用事务。


看看如何使用它:


    using (var dbContextTransaction = PdmContext.Database.BeginTransaction())

            {

                try

                {

                   // HERE your operation insert etc.


                    PdmContext.SaveChanges();


                    dbContextTransaction.Commit(); // here, apply your operation

                }

                catch (Exception)

                {

                    dbContextTransaction.Rollback(); // here, undo your operations

                }

            }


查看完整回答
反对 回复 2022-06-12
?
慕容森

TA贡献1853条经验 获得超18个赞

您可以使用事务管理来处理这种情况。


有两种处理方法。


1)您可以对所有操作使用单个 dbcontext,而不是为单个操作创建多个。


using (var context = new SchoolContext())

{


    try

    {



        context.Students.Add(new Student()

        {

            FirstName = "Rama2",

            StandardId = standard.StandardId

        });



        context.Courses.Add(new Course() { CourseName = "Computer Science" });

        context.SaveChanges();


        transaction.Commit();

    }

    catch (Exception ex)

    {

        transaction.Rollback();

        Console.WriteLine("Error occurred.");

    }

}

2) 使用单个 DbContextTransaction 对象:


using (var context = new SchoolContext())

{

context.Database.Log = Console.Write;


using (DbContextTransaction transaction = context.Database.BeginTransaction())

{

    try

    {

          context.Students.Add(new Student()

        {

            FirstName = "Rama2",

            StandardId = standard.StandardId

        });



        context.SaveChanges();


        context.Courses.Add(new Course() { CourseName = "Computer Science" });

        context.SaveChanges();


        transaction.Commit();

    }

    catch (Exception ex)

    {

        transaction.Rollback();

        Console.WriteLine("Error occurred.");

    }

}

}

我希望它对你有用。


查看完整回答
反对 回复 2022-06-12
  • 3 回答
  • 0 关注
  • 157 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信