it-roy-ru.com

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

Я использую 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;
}
17
cagin

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

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

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

24
Klaus Byskov Pedersen

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

3
David

Мой ответ не упоминает о 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
    }
}
0
Foo