嗨,我刚刚开始使用带有.net核心和EntityFramework Core的MassTransit 4.0。
我已经定义了一个跨越多个类的状态,我已经使用 1-多关系将其连接起来
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 不同。这就是添加查询自定义的原因。
根据您的实现,我认为除非您在映射中执行某些操作,否则没有其他方法。
MassTransit 在 EF Saga 存储库实现中没有什么特别之处,您可以自己检查代码。
我不再使用公共交通了,但也许这个项目 https://github.com/kbilsted/EFCoreEagerFetching 在定义关系方面对其他人有用一次。