Сохранение контекста базы данных, если он действителен - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть вопрос относительно Entity Framework.В своей программе я сначала заполняю свой 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 ]

0 голосов
/ 13 декабря 2018

Вы можете использовать Transaction, что обеспечит возврат операции, выполненной в ее рамках, если операция завершится неудачей на каком-то этапе:

using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
      using (var del = new PdmContext())
      {
          DeleteModel.deleteFromAllTables();
      }
      db.SaveChanges();

      scope.Complete();  // commits the transaction     
}

Теперь изменения в базе данных будут атомарными, поэтомучто он сохранит только все изменения или не сохранит их вообще.Я не включил код обработки исключений для простоты, но по любой причине, если scope.Complete() не выполнялся и существует элемент управления, блок транзакции без выполнения того, что транзакция будет откатываться.

0 голосов
/ 13 декабря 2018

Вы можете обработать такой сценарий с помощью управления транзакциями.

Существует два способа его обработки.

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.");
    }
}
}

Надеюсь, это сработает для вас.

0 голосов
/ 13 декабря 2018

Вам необходимо использовать транзакцию.

посмотрите, как это использовать:

    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
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...