在交易中,我应该多次调用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 });
}
}
答案 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。