MassTransit - 具有 Entity Framework 核心的 Saga 存储库

MassTransit - Saga repository with Entity Framework Core

非常感谢您。

我的项目以 .NET Core 2.2 为目标。

我正在尝试定义一个使用 Masstransit 6.2.5 的服务,它使用带有 SQL 数据库的 SAGA Machine。

使用此代码

services.AddMassTransit(cfg =>
              {
                  cfg.AddConsumersFromNamespaceContaining<SubmitVolunteerConsumer>(); //add consumer
                  cfg.AddSagaStateMachine<UserStateMachine, UserState>(typeof(UserStateMachineDefinition))

                  .EntityFrameworkRepository(r =>
                  {
                      r.ConcurrencyMode = ConcurrencyMode.Pessimistic;

                      services.AddDbContext<DbContext, UserStateDbContext>((provider, build) =>
                      {
                          build.UseSqlServer(connectionString, m =>
                          {
                              m.MigrationsAssembly(Assembly.GetExecutingAssembly().GetName().Name);
                              m.MigrationsHistoryTable($"__{nameof(UserStateDbContext)}");
                          });
                      });

                  });

                  cfg.AddBus(provider => RabbitMqBus.ConfigureBus(provider, false));
              });

导致问题,因为它需要 MassTransit.EntityFrameworkCore 6.2.5(但是,这是使用 Microsoft.EntityFrameworkCore.Relational (3.1.3)),当我尝试 call/use 数据库上下文

收到此错误

Could not load type 'Microsoft.EntityFrameworkCore.Infrastructure.IDbContextOptionsExtensionWithDebugInfo' from assembly 'Microsoft.EntityFrameworkCore, Version=3.1.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.

你能帮我找到一种在我的 Saga 机器上使用 SQL 服务器而不使用引用 Entity Framework Core 3.x 的 Nuget 的方法吗?

顺便说一句,这是我的 Dbcontext

public UserStateDbContext(DbContextOptions options)
  : base(options)
{
}

protected override IEnumerable<ISagaClassMap> Configurations
{
    get { yield return new UserStateMap(); }
}

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    IConfigurationRoot configuration = new ConfigurationBuilder()
      .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
      .AddJsonFile("appsettings.json")
      .Build();
        optionsBuilder.UseSqlServer(configuration.GetConnectionString("GRPPortal"));

}

为什么说“不使用引用 Entity framework 3.x 的 Nuget”?要使用 MassTransit 6.2.5,依赖于 EF Core 3.1.3+ 的 EF Core 持久性。

如果您使用的是旧版本的 EF Core 并且无法升级,那么您需要查看仍然支持您的 EF Core 版本的旧版本的 MassTransit。这可能需要对 MassTransit 的依赖项进行其他绑定重定向,因为您的项目中有较新的版本。

如果你正在使用 EF6 并且不想添加 EFCore,那么有MassTransit.EntityFrameworkIntegration

如果您使用的是较新的 EF Core 版本,那么这可能可以通过绑定重定向来解决,但是,鉴于 EF Core 的状态相当不稳定,例如您正在使用 EF Core 5.x,在发布较新版本的 MassTransit 之前,可能不受支持。

如果您只是不想引入 任何 对 EF Core 的依赖以使 MassTransit 在没有 EF 的情况下与 SQL 服务器一起工作,那么还有其他选择,例如使用 NHibernate .您还可以考虑编写自己的持久性存储库。我不认为这会非常困难,因为这里提供了所有官方持久性的源代码:https://github.com/MassTransit/MassTransit/tree/77eb5d724c8e33ebba6bb846b2a277e4d55fa65a/src/Persistence