2012-06-19 12 views
12

Używam Entity Framework 4.0. Czy to możliwe, że SaveChanges() zwraca 0, ale nie rzuca wyjątku? Na przykład po dodaniu.Czy to możliwe, DbContext.SaveChanges() zwraca 0, ale nie ma wyjątku?

Oto mój kod:

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

Czy coś trzeba oszczędzania? –

+2

Musisz dodać więcej informacji, w przeciwnym razie nikt nie będzie w stanie Ci pomóc. Czy możesz opublikować swój kod? –

+0

Dodałem moje kody. – cagin

Odpowiedz

19

Według the documentation, wartość zwracana DbContext.SaveChanges jest

Liczba obiektów zapisanych do podstawowej bazy danych.

To, co widzisz, jest możliwe tylko wtedy, gdy do bazy danych nie trzeba zapisywać żadnych jednostek.

+0

To prawda - na przykład: jeśli usuniesz wiersz, który już nie istnieje, otrzymasz 0 dotkniętych wierszy – Carsten

+1

@ CarstenKönig Nie, jeśli usuniesz wiersz, który już nie istnieje, baza danych zwróci "0 wierszy dotkniętych" , a EF przetłumaczy to na wyjątek. "żadne jednostki nie były potrzebne do zapisania" oznacza, że ​​nie było żadnych zmian kontekstu przed wywołaniem 'SaveChanges'. – hvd

+0

naprawdę? Muszę spróbować, ale myślę, że miałem podobne problemy w przeszłości bez uzyskania wyjątku, ale dziękuję za poprawkę – Carsten

3

Entity Framework's db.SaveChanges() do usuwania i zapisywania zwraca liczbę wierszy, które są wykonywane. W teście przy użyciu Fake Framework (kody pośredniczące i podkładki) zwracana wartość zawsze będzie równa 0. Jeśli wystąpi błąd w wywołaniu, zostanie zgłoszony wyjątek. Wynika z tego, że żadna metoda wywołująca, której wartość nie jest zwracana z db.SaveChanges w celu potwierdzenia, nie może być przetestowana pod kątem tej samej wartości. Może to okazać się krytyczne, gdy metoda używa wartości zwracanej dbSaveChanges() w celu oszacowania liczby wierszy, których dotyczy dana operacja.

0

Moja odpowiedź nie wspomnieć o DbContext, ale jeśli ktoś używa XEntities i zaczyna sam problem, można spróbować:

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 
} 

problem:

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 
    } 
} 
Powiązane problemy