您好,我刚开始使用带有.net核心和EntityFramework Core的MassTransit 4.0。
我已经定义了一个跨越几个类的状态,我使用
以1-many关系连接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
技巧。
答案 0 :(得分:1)
这是因为EF Core的工作方式与EF 6.0不同。这就是添加查询自定义的原因。
根据您的实现,我认为除非您在映射中执行某些操作,否则没有其他办法。
MassTransit在EF Saga存储库实现中没有什么特别之处,您可以自己检查the code。
答案 1 :(得分:0)
我不再使用Masstransit,但是就一次定义关系而言,这个项目https://github.com/kbilsted/EFCoreEagerFetching可能对其他人有用。