1

指定されたトランザクションは現在の接続に関連付けられていません。現在の接続に関連付けられたトランザクションのみ使用できます。ABP EF IDomainServiceの複数のDbContextアクセスでトランザクションエラーが発生する

1回のトランザクションで複数のDbContextを使用するにはどうすればよいですか?

アップデート1

私はExistingConnection、 を使用する場合は、すべてのDbContextは、同じ接続文字列を使用します。

間違った方法で複数のDbContextを追加しましたか? EntityFrameworkModuleで

public override void PreInitialize() 
{ 
    var configuration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder()); 

    Configuration.Modules.AbpEfCore().AddDbContext<BPDbContext>(options => 
    { 
     if (options.ExistingConnection != null) 
     { 
      options.DbContextOptions.UseSqlServer(options.ExistingConnection); 
     } 
     else 
     { 
      options.DbContextOptions.UseSqlServer(configuration.GetConnectionString(ABPCoreConsts.BPConnectionStringName)); 
     } 

     //options.DbContextOptions.UseSqlServer(
     // configuration.GetConnectionString(ABPCoreConsts.BPConnectionStringName)); 
    }); 

    Configuration.Modules.AbpEfCore().AddDbContext<EPlusDBConext>(options => 
    { 
     if (options.ExistingConnection != null) 
     { 
      options.DbContextOptions.UseSqlServer(options.ExistingConnection); 
     } 
     else 
     { 
      options.DbContextOptions.UseSqlServer(configuration.GetConnectionString(ABPCoreConsts.EECPlusConnectionStringName)); 
     } 

     //options.DbContextOptions.UseSqlServer(
     // configuration.GetConnectionString(ABPCoreConsts.EECPlusConnectionStringName)); 
    }); 

    Configuration.Modules.AbpEfCore().AddDbContext<ProjectManageDbContext>(options => 
    { 
     if (options.ExistingConnection != null) 
     { 
      options.DbContextOptions.UseSqlServer(options.ExistingConnection); 
     } 
     else 
     { 
      options.DbContextOptions.UseSqlServer(configuration.GetConnectionString(ABPCoreConsts.PMConnectionStringName)); 
     } 

     //options.DbContextOptions.UseSqlServer(
     // configuration.GetConnectionString(ABPCoreConsts.PMConnectionStringName)); 
    }); 

    RegisterGenericRepositories(); 
} 

アップデート2

私はそれがカスタム接続のためIConnectionStringResolverを実装することによって動作するようになった:

public class MyDBConnectionStringResolver : DefaultConnectionStringResolver 
{ 
    public override string GetNameOrConnectionString(ConnectionStringResolveArgs args) 
    { 
     var configuration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder()); 

     switch (args["DbContextType"].ToString()) 
     { 
      case "ABPCore.EPlusDBConext": 
       return configuration.GetConnectionString(ABPCoreConsts.EECPlusConnectionStringName); 
      case "ABPCore.BPDbContext": 
       return configuration.GetConnectionString(ABPCoreConsts.BPConnectionStringName); 
      case "ABPCore.ProjectManageDbContext": 
       return configuration.GetConnectionString(ABPCoreConsts.PMConnectionStringName); 
     } 

     return string.Empty; 
    } 
} 

はEntityFrameworkModuleのPreInitialize方法でサービスを置き換えることを忘れないでください。 :

Configuration.ReplaceService<IConnectionStringResolver, MyDbConnectionStringResolver>(DependencyLifeStyle.Transient); 
+0

それは今の仕事だ、https://github.com/BivoZeou/ABPCore – Bivozeou

答えて

3

*DbContextConfigurer.csでこれを追加します。*EntityFrameworkModule.cs

public static void Configure(DbContextOptionsBuilder<*DbContext> builder, DbConnection connection) 
{ 
    builder.UseSqlServer(connection); 
} 

変更この:

public override void PreInitialize() 
{ 
    if (!SkipDbContextRegistration) 
    { 
     Configuration.Modules.AbpEfCore().AddDbContext<*DbContext>(options => 
     { 
      if (options.ExistingConnection != null) 
      { 
       options.DbContextOptions.UseSqlServer(options.ExistingConnection); 
      } 
      else 
      { 
       options.DbContextOptions.UseSqlServer(options.ConnectionString); 
      } 
     }); 
    } 
} 

参考:https://github.com/aspnetboilerplate/module-zero-core-template/commit/da522e76ca2ecefdb7670f009f78575c5b97b4a0


重要

の場合各DbContextは独自の接続文字列を持っている、あなたはhereが説明したようIConnectionStringResolverを実装し、サービスを交換する必要があります。

Configuration.ReplaceService<IConnectionStringResolver, MyConnectionStringResolver>(DependencyLifeStyle.Transient); 
+0

のコードを、私USDが接続を既存の場合複数のdbcontextが1つのconnectionstringを使用すると、SqlExceptionがスローされます。無効なオブジェクト名 'tablexxx'は、間違った方法で複数のdbcontextを追加していますか?私は、EntityFrameworkModule、PreInitializeでdbcontextを追加します。 – Bivozeou

+0

私は確信しています。既存の接続は同じですが、https://github.com/BivoZeou/ABPCoreのコードはここにあります。 – Bivozeou

+0

説明したように 'IConnectionStringResolver'を実装して置き換えることはできますか? [ここ](https://github.com/aspnetboilerplate/aspnetboilerplate/pull/1834#issuecomment-326041970)? [this](https://github.com/aspnetboilerplate/aspnetboilerplate/issues/2325)と同じ問題があります。 – aaron