C# 跨指向其他数据库的多个上下文的环境事务
设置的简短说明: EF核心与fluent映射一起使用。有三个数据库,每个数据库有一个上下文。问题是在两个或所有三个上下文中开始一个事务范围。OnConfiguration方法在每个上下文中都会被覆盖,如下例所示: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
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。