使用 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 在定义关系方面对其他人有用。
您好,我刚刚开始使用带有 .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 在定义关系方面对其他人有用。