使用 EntityFramework 核心的 MassTransit 4.0 saga 的自动状态持久化

Automatic persistence of state with MassTransit 4.0 saga with EntityFramework Core

您好,我刚刚开始使用带有 .net 核心和 EntityFramework 核心的 MassTransit 4.0。

我定义了一个跨越多个 类 的状态,我使用

将其连接成一对多关系
public class SagaInstanceMap3 : IEntityTypeConfiguration<InstanceState>
{
    public void Configure(EntityTypeBuilder<InstanceState> builder)
    {
        builder.HasKey(x => x.CorrelationId);
        builder.HasMany(x => x.Args);
        builder.HasMany(x => x.MoreArgs);
        builder.Property(x => x.RowVersion).IsRowVersion().IsRequired(); 
    }
}

创建初始状态时,所有内容都存储在数据库中,但在接下来的转换中获取状态时,仅获取主要 table.

我已经能够使用 queryCustomization 解决这个问题,如下所示

   public static void Main()
    {
        var saga = new MySaga();

        var contextFactory = new SagaWithDependencyContextFactory();

        using (var context = contextFactory.CreateDbContext(Array.Empty<string>()))
        {
            context.Database.Migrate();
        }

        Func<DbContext> sagaDbContextFactory = () => contextFactory.CreateDbContext(Array.Empty<string>());

        var efSagaRepository =
            new EntityFrameworkSagaRepository<InstanceState>(sagaDbContextFactory,
                queryCustomization: q => q.Include(it => it.Args).ThenInclude(it => it.MoreArgs),
                optimistic: true); 

不幸的是,这意味着我必须记住将所有关系映射两次!有没有办法让 EF Core 集成在转换时急切地获取所有子 tables?

EF6.0 与以前版本的 MassTransit 的集成不需要我执行 queryCustomization 技巧。

这是因为 EF Core 的工作方式与 EF 6.0 不同。这就是添加查询自定义的原因。

根据你的实现,我认为没有其他办法,除非你在映射中做一些事情。

MassTransit 在 EF Saga 存储库实现中没有什么特别之处,您可以自己检查the code

我不再使用 Masstransit,但也许这个项目 https://github.com/kbilsted/EFCoreEagerFetching 在定义关系方面对其他人有用。