web-dev-qa-db-fra.com

Est-ce possible, DbContext.SaveChanges () retourne sans exception?

J'utilise Entity Framework 4.0. Est-il possible que SaveChanges() renvoie 0 mais ne lève pas d'exception? Par exemple, après avoir ajouté.

Voici mon code:

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

Selon la documentation , la valeur de retour de DbContext.SaveChanges est 

Nombre d'objets écrits dans la base de données sous-jacente.

Ainsi, ce que vous voyez n'est possible que lorsqu'aucune entité n'a besoin d'être enregistrée dans la base de données.

24

La fonction db.SaveChanges () d'Entity Framework pour les suppressions et les sauvegardes renvoie le nombre de lignes effectuées. En test utilisant le framework Fakes (talons et cales), la valeur renvoyée sera toujours 0. S'il y a une erreur dans l'appel, une exception sera levée. Cela implique que toute méthode d'appel reposant sur une valeur supérieure à zéro renvoyée par db.SaveChanges pour confirmation ne peut pas être testée pour cette même valeur. Cela peut s'avérer critique lorsqu'une méthode utilise la valeur de retour db.SaveChanges () pour évaluer le nombre de lignes affectées dans une opération donnée. 

3
David

Ma réponse ne parle pas de DbContext, mais si quelqu'un utilise XEntities et a le même problème, vous pouvez essayer:

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
}

Le problème:

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