C# 跨指向其他数据库的多个上下文的环境事务

C# 跨指向其他数据库的多个上下文的环境事务,c#,entity-framework-core,dbcontext,transactionscope,fluent-entity-framework,C#,Entity Framework Core,Dbcontext,Transactionscope,Fluent Entity Framework,设置的简短说明: EF核心与fluent映射一起使用。有三个数据库,每个数据库有一个上下文。问题是在两个或所有三个上下文中开始一个事务范围。OnConfiguration方法在每个上下文中都会被覆盖,如下例所示: public class MyContext : DbContext { private string _connectionString; public MyContext(string connectionString) { _connec

设置的简短说明:

EF核心与fluent映射一起使用。有三个数据库,每个数据库有一个上下文。问题是在两个或所有三个上下文中开始一个事务范围。OnConfiguration方法在每个上下文中都会被覆盖,如下例所示:

public class MyContext : DbContext
{
    private string _connectionString;

    public MyContext(string connectionString)
    {
        _connectionString = connectionString;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        /* Replace a placeholder with the database name */
        optionsBuilder.UseSqlServer(string.Format(_connectionString, "database1");
    }    
}
我已尝试开始交易的内容:

在一个上下文上开始一个事务并将其传递给另一个上下文

using (var transaction = context1.Database.BeginTransaction()) 
{
    context2.Database.UseTransaction(transaction.GetDbTransaction());
    /*do something on context1*/
    /*do something on context2*/

    transaction.Commit();
}
开始事务作用域

using (var scope = new TransactionScope()) 
{
    /*do something on context1*/
    /*do something on context2*/
    /*do something on context3*/

    scope.Complete();
}
EF在每种方式上抛出一个环境事务异常

我在互联网的某个地方找到了另一个解决方案(丢失了链接,抱歉,伙计们)。 他们没有将连接字符串传递给上下文,而是将连接本身传递给上下文。但我不明白在当时的环境下,如何连接到不同的数据库


有人有解决此问题的解决方案吗?

没有帮助吗?当您要提交跨多个数据库的事务时,是否意识到运行分布式事务协调器(MSDTC)的必要性?您可能想让EF认为它只处理一个数据库,例如使用别名,从而使它变得更容易。@stuartd恐怕不行。我按照文档进行了操作,但似乎它们只对同一数据库使用上下文,因此没有环境事务。@GertArnold您如何使用别名?顺便说一句:感谢MSDTC的提示,它实际上没有运行,但启动它并没有解决问题。@SebastianS。你知道如何使用别名了吗?甚至我也想在事务中使用指向同一数据库的多个DbContext。这样做没有帮助吗?当您想提交跨多个数据库的事务时,您是否意识到运行分布式事务协调器(MSDTC)的必要性?您可能想让EF认为它只处理一个数据库,例如使用别名,从而使它变得更容易。@stuartd恐怕不行。我按照文档进行了操作,但似乎它们只对同一数据库使用上下文,因此没有环境事务。@GertArnold您如何使用别名?顺便说一句:感谢MSDTC的提示,它实际上没有运行,但启动它并没有解决问题。@SebastianS。你知道如何使用别名了吗?甚至我想在事务中使用指向同一个DB的多个DbContext。