使用 2 个 DBContext 开始事务

Begin transaction with 2 DBContexts

想法:我正在尝试 运行 使用 2 个不同的 dbContext 插入到 2 个数据库,目标是允许角色从两个 QB 返回插入,以防以太之一出现异常插入。

我的代码:

using (var db1 = new DbContext1())
{
    db1.Database.Connection.Open();
    using (var trans = db1.Database.Connection.BeginTransaction())
    {
        //do the insertion into db1
        db1.SaveChanges();

        using (var db2 = new DbContext2())
        {
            //do the insertions into db2
            db2.SaveChanges();
        }
        trans.Commit();
    }
}

第一次调用保存更改时:db1.SaveChanges();我收到无效操作异常:sqlconnection 不支持并行事务

我试图弄清楚它的确切含义、为什么会发生以及如何解决它,但一直未能实现。

所以我的问题是: 这到底是什么意思?为什么我会得到这个例外? 我该如何解决? 有没有一种方法可以使用不同的方式来使用 begin transaction 而不会导致此错误?

此外,这是使用 begin transaction 的正确方法还是我应该做一些不同的事情?

*** 为了澄清起见,我使用的是 db1.Database.Connection.Open();因为否则我会收到 "connection is close" 错误。

与其尝试将您的连接和事务扩展到两个 DbContext,不如在 DbContext 之外处理您的连接和事务,像这样:

using (var conn = new System.Data.SqlClient.SqlConnection("yourConnectionString"))
{
    conn.Open();
    using (var trans = conn.BeginTransaction())
    {
        try
        {
            using (var dbc1 = new System.Data.Entity.DbContext(conn, contextOwnsConnection: false))
            {
                dbc1.Database.UseTransaction(trans);
                // do some work
                // ...
                dbc1.SaveChanges();
            }

            using (var dbc2 = new System.Data.Entity.DbContext(conn, contextOwnsConnection: false))
            {
                dbc2.Database.UseTransaction(trans);
                // do some work
                // ...
                dbc2.SaveChanges();
            }
            trans.Commit();
        }
        catch
        {
            trans.Rollback();
        }
    }
}

我发现我只是在滥用语法,所以为了帮助任何可能偶然发现这个问题的人,这是正确的方法:

using (var db1 = new DbContext1())
{
    using (var trans = db1.Database.BeginTransaction())
    {
        try
        {
            //do the insertion into db1
            db1.SaveChanges();

            using (var db2 = new DbContext2())
            {
                //do the insertions into db2
                db2.SaveChanges();
            }
            trans.Commit();
        }
        catch (Exception e)
        {
            trans.Rollback();  
        }
    }
}