web-dev-qa-db-ja.com

DbContext.SaveChanges()は0を返しますが、例外はありませんか?

Entity Framework 4.0を使用しています。 SaveChanges()が0を返しても例外をスローしないことは可能ですか?たとえば、追加した後。

これが私のコードです:

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;
}
20
cagin

ドキュメント によると、DbContext.SaveChangesの戻り値は

基になるデータベースに書き込まれたオブジェクトの数。

したがって、エンティティをデータベースに保存する必要がない場合にのみ、表示される内容が可能になります。

28

Entity Frameworkの削除および保存用のdb.SaveChanges()は、影響を受ける行数を返します。ただし、Fakesフレームワーク(スタブおよびシム)を使用したテストでは、返される値は常に0になります。呼び出しでエラーが発生すると、例外がスローされます。つまり、db.SaveChangesから返されたゼロより大きい値に依存する呼び出しメソッドは、確認のために同じ値をテストすることができません。これは、メソッドがdb.SaveChanges()の戻り値を使用して、特定の操作で影響を受ける行数を評価するときに重要になる場合があります。

3
David

私の答えはDbContextについて言及していませんが、誰かがXEntitiesを使用していて同じ問題が発生している場合は、次のことを試してください:

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
}

問題:

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
Tân