c# - Entity Framework 6 中显式数据库事务的意义是什么?

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

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

最佳答案

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

DbContextSaveChanges() 方法是 Entity Framework 中工作单元模式的实现。

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

关于c# - Entity Framework 6 中显式数据库事务的意义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26524910/

相关文章:

c# - ASP.NET : How to prevent opening same site a few times in parallel?

c# - 源 IQueryable 的提供程序未实现 IAsyncQueryProvider

java - App Engine Java JDO 中的单元测试 XG 跨组事务

c# - NserviceBus 6.x 基于传输事务级别的消息管道场景

c# - 使用 Asp.net MVC web.api 为什么我应该重定向而不是仅仅调用其他函数?

c# - 使用 C# 将时间数据插入 SQL Server

c# - 模型数据未传递给 Asp Mvc 中的 View

c# - 已检测到关系 y 的角色 x 的冲突更改

WPF、WCF、Entity、MVVM的疑惑!

ruby-on-rails - 为什么这个事务在 ActiveRecord 中不起作用?