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

我对实体框架有疑问。在我的程序中,我首先用数据填充我的 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));

            }

        }

我似乎无法弄清楚这一点。任何人都可以帮助解决这个问题吗?:)


凤凰求蛊
浏览 158回答 3
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()没有执行并且控制存在事务块而不执行,则事务将回滚。

千巷猫影

您需要使用事务。看看如何使用它:    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                }            }

慕容森

您可以使用事务管理来处理这种情况。有两种处理方法。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.");    }}}我希望它对你有用。
打开App,查看更多内容
随时随地看视频慕课网APP