EF Core 中一对多关系的自动连接表

Automatic join tables for one to many relationships in EF Core

我在 Azure SQL 服务器上使用代码优先的 EF Core 6。我有几个实体类型用于跨越几个月的交易。需要将注释与不同的实体相关联。注释将在交易时间范围内由多个用户添加。出于审计目的,我需要能够跟踪输入的每条笔记的每个版本。我使用系统版本化时间 tables 来跟踪数据库其余部分的实体更改。

我想在交易实体中有一个注释列表导航 属性。我不希望在 Notes 实体中有相应的导航 属性。

public class TransactionEntity
{
   ...
   public List<Note> Notes { get; set; }
}

public class Note
{
   // text, timestamp, CreatedBy, ValidFrom, ValidTo
}

我将其配置为:

public void Configure(EntityTypeBuilder<TransactionEntity> entity)
{
   entity.HasMany(t => t.Notes)
         .WithOne();
}

当我为此创建迁移时,它会在 Notes table 中创建一个外键列。我不希望它这样做,因为在 4-5 个不同的实体中会有一个注释列表,我不希望每个实体都有一个外键列。

我希望 EF Core 在后台为每个事务实体类型自动创建一个连接 table,这样我就可以在代码中引用 TransactionEntity.Notes 而不必处理连接 table。 EF Core 提供了多对多关系,但这不是多对多关系,我宁愿避免以这种方式处理它,只是为了拥有自动加入 table 选项。我想我也可以使用拥有的实体自动加入 table 创建。但这样做的问题是,我看不到任何方法可以对拥有的实体使用临时 tables 功能,我将不得不提出仅适用于此 属性 的审计代码。

我可以为每个需要注释的交易实体手动创建连接 table。但我希望有更简洁、代码更少的解决方案,让我无需手动查询连接就可以访问笔记 table。我还希望能够快速将注释添加到新的交易实体类型,而无需创建新的连接 table.

有没有一种我不知道的方法可以做到这一点,或者有一种更有意义的不同方法吗?

对于任何感兴趣的人——在玩弄这个之后我发现你实际上可以将时间 tables 与拥有的实体类型一起使用,并且可以使用拥有的实体类型自动创建连接 table:

entity.OwnsMany(i => i.Notes, n => {
                n.ToTable("TransactionEntityNotes", schema, tb => tb.IsTemporal(ttb =>
                    {
                        ttb.HasPeriodStart("ValidFrom");
                        ttb.HasPeriodEnd("ValidTo");
                        ttb.UseHistoryTable("TransactionEntityHistory", schema);
                    }));

                n.Property<DateTime>(nameof(Note.Timestamp))
                    .HasDefaultValueSql("getutcdate()");
            });

现在我可以访问 Notes 作为 TransactionEntity 的导航 属性,而无需创建单独的连接 table 实体并添加新的 DbSet.这似乎是我想要完成的最干净的解决方案。