EntityFramework Transaction - 保存到多个表

时间:2017-02-20 15:58:18

标签: c# entity-framework

如果保存时出现异常,以下代码是否会回滚更改?

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();
        }
    }
}

使用一个优于其他优势是否有任何优势?

1 个答案:

答案 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

如果您有多个方法可以修改上下文对象,但是您希望有最终决定权,如果他们所做的更改都将被提交,那么定义显式事务也很有用。

相关问题