Подтвердить что ты не робот

Возможно ли, что DbContext.SaveChanges() возвращает 0, но не имеет исключения?

Я использую Entity Framework 4.0. Возможно ли, что SaveChanges() возвращает 0, но не генерирует исключение? Например, после добавления.

Вот мой код:

try
{
    _context.CodeProducts.Add(entity);
    _context.SaveChanges();

    //Shell I control return result from SaveChanges() in here.
    //However doesn't throw an exceoption?

    return new MethodResponse()
    {
        ResultText = "Successful",
        Type = MethodResponse.ResponseType.Succeed
    };
}
catch (OptimisticConcurrencyException exc)
{
    throw exc;
}
catch (UpdateException exc)
{
    throw exc;
}
catch (Exception exc)
{
    throw exc;
}
4b9b3361

Ответ 1

Согласно документации, возвращаемое значение DbContext.SaveChanges равно

Количество объектов, записанных в базовую базу данных.

То, что вы видите, возможно только тогда, когда никакие объекты не должны быть сохранены в базе данных.

Ответ 2

Entity Framework db.SaveChanges() для удаления и сохранения возвращает количество строк, на которые влияют. Однако в тесте с использованием Fakes Framework (заглушки и прокладки) возвращаемое значение всегда будет равно 0.

Если в вызове произошла ошибка, будет сгенерировано исключение. Подразумевается, что любой вызывающий метод, использующий значение, большее нуля, возвращенное из db.SaveChanges() для подтверждения, не может быть проверен на то же значение.

Это может оказаться критически важным, если метод использует возвращаемое значение db.SaveChanges() для оценки количества строк, затронутых в данной операции.

Ответ 3

Мой ответ не упоминается о DbContext, но если кто-то использует XEntities и получает ту же проблему, вы можете попробовать:

using (var entities = new XEntities())
{
    var product = entities.Products.SingleOrDefault(x => x.Id == id);
    product.Type = "New type"; // modifying

    int flag = entities.SaveChanges(); // 1
    // or await entities.SaveChangesAsync(); // 1
}

Проблема:

public class Demo
{
    private XEntities _entities = new XEntities();

    public void Test(int id)
    {
        var product = _entities.Product.SingleOrDefault(x => x.Id == id);
        product.Type = "New type"; // modifying

        int flag = _entities.SaveChanges(); // 0 <<<====
        // or await entities.SaveChangesAsync(); // 0  <<<====

        // you need to create new instance of XEntities to apply changes
    }
}