什么';这是实体框架6中显式数据库事务的要点

本文关键字:数据库 事务 框架 实体 什么 | 更新日期: 2023-09-27 18:27:28

在我的项目中,依赖注入将为每个请求实例化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();
    }
}

什么';这是实体框架6中显式数据库事务的要点

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

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

Database.BeginTransaction()在底层数据库上创建事务,还允许调用者设置可选的IsolationLevel。这是一个在体系结构中处于完全不同级别的事务。这是我可能永远不会使用的东西,因为我不喜欢在数据库中有任何业务逻辑,但我敢打赌,它在遗留系统中有很大的使用空间。

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

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