Проверьте, была ли вставка или обновление успешной в Entity Framework

В ADO.NET ExecuteNonQuery() «Для операторов UPDATE, INSERT и DELETE возвращаемое значение — это количество строк, затронутых командой» (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx)

В EF v1 метод context.SaveChanges() возвращает «Количество объектов в состоянии «Добавлено», «Изменено» или «Удалено» при вызове SaveChanges. (http://msdn.microsoft.com/en-us/library/bb739065.aspx)

Скажите, когда несколько объектов (или один объект) добавляются или обновляются в контекст и вызывается метод context.SaveChanges(), как проверить, были ли фактические INSERT или UPDATE успешными.

Можем ли мы предположить, что INSERT(s) или UPDATE(s) были успешными, если НЕ было исключений?

Спасибо


person dev    schedule 25.08.2009    source источник


Ответы (3)


Да, если нет исключений, вы можете считать, что операторы выполнены успешно.

person Andrew Peters    schedule 25.08.2009

Может быть, это не прямой ответ на вопрос, но может помочь. По умолчанию все команды инкапсулируются в одну транзакцию DbTransaction при вызове метода SaveChanges (). Значит, либо все команды будут успешно выполнены, либо ни одна. Это один из способов узнать, была ли вставка, обновление или удаление успешной.

person Misha N.    schedule 26.08.2009

В EntityFramework SaveChangesAsync() возвращает int. Таким образом, вы можете проверить, является ли это > 0 или нет.

Если что-то случится с SaveChangesAsync(), будет возвращено количество обработанных строк, и это означает, что if value > 0 затем true. Так просто, вы можете иметь следующие сценарии:

ВСТАВИТЬ

public Task<bool> CreateEntity(Entity entity){

    if(entity == null)
            return false;

    await _dataContext.Entities.AddAsync(entity);

    var created = await _dataContext.SaveChangesAsync();

    return created > 0;
}

ОБНОВЛЕНИЕ

public async Task<bool> UpdateEntity(Entity entityToUpdate)
{
     if(entityToUpdate == null)
               return false;

     _dataContext.Posts.Update(entityToUpdate);

     var updated = await _dataContext.SaveChangesAsync();

     return updated > 0;
}

УДАЛИТЬ

public async Task<bool> DeleteEntity(int entityId)
{
     var entity = await _dataContext.Entities.FindAsync(entityId);

     if (entity == null)
             return false;

     _dataContext.Entities.Remove(entity);

     var deleted = await _dataContext.SaveChangesAsync();

     return deleted > 0;
}

И в ваших методах теперь вы можете просто проверить, успешно ли это изменение:

Для простого сценария MVC:

public Task<IActionResult> CreateEntity(EntityModel model)
{
     if(model == null)
            return StatusCode(404);

     var entity = new Entity
     {
          attribute1 = model.attribute1,
          attribute2 = model.attribute3
     };

     var isCreated = await _entityService.CreateEntity(entity);

     if(isCreated)
     {
          //do something and return a view.
     }
     else
     {
         //you can return a status code, or an error view.
     }
}

Вы можете сделать то же самое для обновления и удаления.

person Burak    schedule 31.12.2019
comment
Да, но если что-то не так, эти методы будут вызывать исключение (например, DbUpdateException), поэтому они либо всегда возвращают true, либо выдают исключение. Это многословный способ сказать: все в порядке, когда не выдается никаких исключений. Кроме того, наличие отдельных методов для всех действий CUD не очень полезно при работе с графами объектов. Сохранение графа объектов может включать как вставку, обновление, так и удаление. Я лучше просто займусь делом, а потом позвоню SaveChanges и позволю EF решить, что нужно делать. В общем, я не вижу особых достоинств в том, что вы здесь предлагаете. - person Gert Arnold; 31.12.2019
comment
Я понимаю вашу точку зрения, но автор просто спросил, есть ли способ, с помощью которого мы можем проверить, является ли утверждение успешным или неудачным, поэтому, как я уже упоминал, это всего лишь простой способ добиться этого. Это просто небольшое преобразование примера, который автор привел выше (ADO.Net): the return value is the number of rows affected by the command. - person Burak; 02.01.2020
comment
Он только что спросил, есть ли подобный подход в EF, это может быть плохой практикой, но в конце концов 1 больше, чем 0. Вы правы, когда говорите, что либо возвращает true, либо выдает исключение. Но если вопрос спрашивает: Please tell, when multiple entities (or single entity) are added or updated to context and context.SaveChanges() method is called, how to check if actual INSERT or UPDATE was successful., Таким образом, в этом подходе, если одна или несколько строк действительно выполняются, это возвращает, можно сказать, успех. Я надеюсь, что вы понимаете мою точку зрения здесь. :) - person Burak; 02.01.2020
comment
Именно так я делаю это в EF Core, когда хочу знать, что-то обновляется или вставляется. Рад видеть, что я не единственный. - person AussieJoe; 21.04.2020