实体框架6中显式数据库事务的重点是什么?

时间:2014-10-23 09:18:11

标签: c# entity-framework transactions domain-driven-design

在我的项目中,依赖注入将为每个请求实例化DomainContext(实体框架6 DbContext)。我想知道什么是关于交易的正确行动方案。我知道SaveChanges会在内部使用交易。

我是否应该担心DomainContext中可能发生的变化?

我认为使用显式交易可能会使我免于这种情况,例如:

public class FooService : IFooService
{
    private DomainContext db;

    public FooService(DomainContext db)
    {
        this.db = db;
    }

    public void MergeEntities(Entity source, Entity target) 
    {
        using (var uow = db.Database.BeginTransaction())
        {
            // merge source into target

            db.SaveChanges();

            uow.Commit();
        }
    }
}

我不确定是否应该使用它,它可能会给我同样的保护:

public class FooService : IFooService
{
    private DomainContext db;

    public FooService(DomainContext db)
    {
        this.db = db;
    }

    public void MergeEntities(Entity source, Entity target) 
    {
        // merge source into target

        db.SaveChanges();
    }
}

2 个答案:

答案 0 :(得分:1)

DbContext.SaveChanges()是原子的,会在它自己的交易下自动执行。所以你的第二个例子就足够了。

DbContextSaveChanges()方法是实体框架中工作单元模式的实现。

Database.BeginTransaction()在底层数据库上创建事务,并允许调用者设置可选的IsolationLevel。它是架构中完全不同级别的事务。这是我可能永远不会使用的东西,因为我不想在数据库中拥有任何业务逻辑,但我敢打赌它在遗留系统中的应用范围很广。

答案 1 :(得分:1)

您可以尝试使用单元测试来证明EF使用事务。
尝试插入多行,其中一行包含无效数据。
然后,使用SaveChanges()将这些多个记录保存到数据库中 如果全部或部分记录被回滚,则EF使用交易。

或者,工作单位或交易范围是好的 或者您也可以使用下面的代码检查DbContext上的更改:
    DbContext.ChangeTracker.Entries()。Any(e => e.State == EntityState.Added
    || e.State == EntityState.Modified
    || e.State == EntityState.Deleted);