如果保存时出现异常,以下代码是否会回滚更改?
using (SampleEntities context = new SampleEntities())
{
//Code Omitted
context.EmpPercAdjustments.AddRange(pp);
context.SampleJobs.AddRange(sampleJobs);
context.SaveChanges();
}
或者
我需要使用交易吗?
using (SampleEntities context = new SampleEntities())
{
//Code Omitted
using (System.Data.Entity.DbContextTransaction tranc = context.Database.BeginTransaction( ))
{
try
{
context.EmpPercAdjustments.AddRange(pp);
context.SampleJobs.AddRange(sampleJobs);
context.SaveChanges();
tranc.Commit();
}
catch (Exception ee)
{
tranc.Rollback();
}
}
}
使用一个优于其他优势是否有任何优势?
答案 0 :(得分:5)
是的,它会正确回滚。
在这种情况下,您不需要运行显式事务,因为实体框架已经创建了一个事务。
如果你想要f.e.,通过调用context.Database.BeginTransaction()
创建一个事务是好的。获取刚刚插入的记录的ID,如下所示:
using (SampleEntities context = new SampleEntities())
{
using (System.Data.Entity.DbContextTransaction trans = context.Database.BeginTransaction( ))
{
context.SampleJobs.Add(newJob);
context.SaveChanges();
var jobId = newJob.Id;
//do other things, then commit or rollback
trans.Commit();
}
}
在这种情况下,在调用SaveChanges()
之后,将应用context objects
上所做的更改(因此您可以在范围内读取数据库生成的已添加对象的ID),但它们仍然必须被提交或回滚,因为更改只是dirty written
。
如果您有多个方法可以修改上下文对象,但是您希望有最终决定权,如果他们所做的更改都将被提交,那么定义显式事务也很有用。