2012-06-19 9 views
12

Uso Entity Framework 4.0. ¿Es posible que SaveChanges() devuelva 0 pero no lanza una excepción? Por ejemplo, después de agregar.¿Es eso posible, DbContext.SaveChanges() devuelve 0 pero no tiene una excepción?

Aquí está mi código:

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; 
} 
+1

¿Hubo algo que necesitan ser salvados? –

+2

Necesita agregar más información, de lo contrario, nadie podrá ayudarlo. ¿Puedes publicar tu código? –

+0

Agregué mis códigos. – cagin

Respuesta

19

Según the documentation, el valor de retorno de DbContext.SaveChanges es

El número de objetos escritos en la base de datos subyacente.

Entonces, lo que ves solo es posible cuando no se deben guardar entidades en la base de datos.

+0

Correcto, por ejemplo: si elimina una fila que ya no existe, obtendrá 0 filas afectadas – Carsten

+1

@ CarstenKönig No, si elimina una fila que ya no existe, la base de datos devolverá "0 filas afectadas" , y EF traducirá eso en una excepción. "no se necesita salvar ninguna entidad" significa que no hubo cambios en el contexto antes de que se llamara a 'SaveChanges'. – hvd

+0

realmente? Tengo que probarlo, pero creo que tuve problemas similares en el pasado sin obtener una excepción, pero gracias por la corrección – Carsten

3

El db.SaveChanges() de Entity Framework() para eliminar y guardar devuelve las filas de números que se están efectuando. Sin embargo, en la prueba que usa el marco de Fakes (stubs and shims), el valor devuelto siempre será 0. Si hay un error en la llamada, se lanzará una excepción. La implicación es que cualquier método de llamada que se base en un valor mayor que cero devuelto por db.SaveChanges para confirmación no puede ser probado para ese mismo valor. Esto puede ser crítico cuando un método usa el valor de retorno db.SaveChanges() para evaluar el número de filas afectadas en una operación dada.

0

Mi respuesta no está mencionando sobre DbContext, pero si alguien está usando XEntities y conseguir mismo problema, puede intentar:

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 
} 

El problema:

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 
    } 
} 
Cuestiones relacionadas