【发布时间】:2018-01-12 10:05:10
【问题描述】:
您好,我刚刚开始使用带有 .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();
}
}
在创建初始状态时,所有内容都存储在数据库中,但在接下来的转换中获取状态时,只获取主表。
我已经能够使用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 集成在转换时急切地获取所有子表?
EF6.0 与之前版本的 MassTransit 集成不需要我使用 queryCustomization 技巧。
【问题讨论】:
-
这是因为 EF Core 的工作方式与 EF 6.0 不同。这就是添加查询自定义的原因。我认为没有其他办法,除非你在映射中做一些事情。 MT 在 EF Saga 仓库实现中没有什么特别之处,可以自己查看代码。
标签: .net-core entity-framework-core masstransit