it-swarm.com.de

Ist das möglich, gibt DbContext.SaveChanges () zurück, hat aber keine Ausnahme?

Ich verwende Entity Framework 4.0. Ist es möglich, dass SaveChanges() 0 zurückgibt, aber keine Ausnahme auslöst? Zum Beispiel nach dem Hinzufügen.

Hier ist mein 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

Gemäß der Dokumentation ist der Rückgabewert von DbContext.SaveChanges 

Die Anzahl der Objekte, die in die zugrunde liegende Datenbank geschrieben werden.

Was Sie sehen, ist also nur möglich, wenn keine Entitäten in der Datenbank gespeichert werden mussten.

24

Db.SaveChanges () von Entity Framework zum Löschen und Speichern gibt die Anzahl der Zeilen zurück, die ausgeführt werden. Im Test mit dem Fakes Framework (Stubs und Shims) ist der zurückgegebene Wert jedoch immer 0. Wenn der Aufruf einen Fehler enthält, wird eine Ausnahme ausgelöst. Die Folge ist, dass jede aufrufende Methode, die zur Bestätigung von db.SaveChanges auf einen Wert größer als Null zurückgesetzt wird, nicht für denselben Wert getestet werden kann. Dies kann sich als kritisch erweisen, wenn eine Methode den Rückgabewert db.SaveChanges () verwendet, um die Anzahl der in einer bestimmten Operation betroffenen Zeilen auszuwerten. 

3
David

Meine Antwort erwähnt nicht DbContext, aber wenn jemand XEntities benutzt und dasselbe Problem bekommt, können Sie folgendes versuchen:

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
}

Das 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
    }
}
0
Foo