这可能,DbContext.SaveChanges()返回0但没有异常?

时间:2012-06-19 08:46:29

标签: c# asp.net entity-framework c#-4.0 entity-framework-4

我使用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;
}

4 个答案:

答案 0 :(得分:27)

根据the documentationDbContext.SaveChanges的返回值为

  

写入底层数据库的对象数。

所以只有在没有实体需要保存到数据库时才能看到你所看到的。

答案 1 :(得分:3)

实体框架的删除和保存的db.SaveChanges()返回正在生效的行数。但是,在使用Fakes Framework(存根和填充程序)的测试中,返回的值将始终为0.如果调用中存在错误,则将引发异常。这意味着任何依赖于从db.SaveChanges返回的大于零的值的调用方法都无法针对相同的值进行测试。当方法使用db.SaveChanges()返回值来评估给定操作中受影响的行数时,这可能很重要。

答案 2 :(得分:0)

我的回答没有提及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
    }
}

答案 3 :(得分:0)

注意到如果您更新实体,但实际上没有任何更改,SaveChangesAsync()将返回0,而Exception将是null