2012-06-19 9 views
12

Uso Entity Framework 4.0. È possibile che SaveChanges() restituisca 0 ma non generi un'eccezione? Ad esempio, dopo aver aggiunto.È possibile che DbContext.SaveChanges() restituisca 0 ma non abbia un'eccezione?

Ecco il mio codice:

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

successo qualcosa ha bisogno di risparmio? –

+2

Devi aggiungere ulteriori informazioni altrimenti nessuno sarà in grado di aiutarti. Puoi pubblicare il tuo codice? –

+0

Ho aggiunto i miei codici. – cagin

risposta

19

Secondo the documentation, il valore di ritorno di DbContext.SaveChanges è

Il numero di oggetti scritti nel database sottostante.

Quindi, quello che si vede è possibile solo, quando non ci sono le entità necessarie per essere salvati nel database.

+0

Esatto, ad esempio: se elimini una riga che non esiste più otterrai 0 righe interessate – Carsten

+1

@ CarstenKönig No, se elimini una riga che non esiste più, il database restituirà "0 righe interessate" e EF lo tradurrà in un'eccezione. "nessuna entità ha bisogno di essere salvata" significa che non ci sono stati cambiamenti nel contesto prima che venisse chiamato "SaveChanges". – hvd

+0

davvero? Devo provarlo ma penso di aver avuto problemi simili in passato senza ottenere un'eccezione, ma grazie per la correzione – Carsten

3

Il db.SaveChanges() di Entity Framework per eliminare e salvare restituisce il numero di righe in corso. Nel test che utilizza Fakes Framework (stub e shim), tuttavia, il valore restituito sarà sempre 0. Se c'è un errore nella chiamata, verrà generata un'eccezione. L'implicazione è che qualsiasi metodo di chiamata che si basa su un valore maggiore di zero restituito da db.SaveChanges per la conferma non può essere testato per lo stesso valore. Ciò potrebbe rivelarsi fondamentale quando un metodo utilizza il valore restituito db.SaveChanges() per valutare il numero di righe interessate in una determinata operazione.

0

La mia risposta non è menzionare su DbContext, ma se qualcuno sta usando XEntities e ottenere lo stesso problema, si può provare:

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 
} 

Il 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 
    } 
} 
Problemi correlati