EF6多次调用事务中的SaveChanges函数

时间:2016-04-15 23:47:44

标签: c# asp.net-mvc entity-framework entity-framework-6

在交易中,我应该多次调用SaveChanges(),或者只调用一次?

他们之间有什么区别? 非常感谢。

我是否只能在Commit()函数之前编写一次SaveChanges()?

using (var transaction = entities.Database.BeginTransaction())
{
    try
    {
        var product = entities.Product.Add(new Product()
        {
            Name = name,
            Shape = shape
        });

        entities.SaveChanges();  // here

        foreach (var image in images)
        {

            entities.Image.Add(new Image()
            {
                ProductId = product.Id,
                Url = image
            });
        }
        entities.SaveChanges();  // here

        foreach (var specification in specifications)
        {

            entities.Specification.Add(new Specification()
            {
                Name = specification.Split(',')[0],
                Value = specification.Split(',')[1].AsDecimal(),
                ProductId = product.Id
            });
        }
        entities.SaveChanges(); // here

        transaction.Commit();

    }
    catch (Exception)
    {
        transaction.Rollback();
        return Json(new { status = false });
    }
}

2 个答案:

答案 0 :(得分:2)

大多数操作都不需要交易。例如,通过将子实体添加到父项的导航属性,可以在没有事务的情况下重写代码,如下所示:

var product = entities.Product.Add(new Product()
{
    Name = name,
    Shape = shape
});
foreach (var image in images)
{
    product.Images.Add(new Image()
    {
        Url = image
    });
}
foreach (var specification in specifications)
{
    product.Specifications.Add(new Specification()
    {
        Name = specification.Split(',')[0],
        Value = specification.Split(',')[1].AsDecimal(),
    });
}
entities.SaveChanges();

您的现有代码确实需要一个事务,并且在产品添加后需要SaveChanges,并且在提交事务之前需要结束。这是因为您指的是添加实体的product.Id,它只在您调用SaveChanges时生成。您可以安全地删除代码中的第二个SaveChanges,因为您没有引用图像的生成键。

答案 1 :(得分:0)

您可以在设置中更改所需的内容,然后在完成所有更改后,每个上下文只调用一次SaveChanges。