【问题标题】:Automatic join tables for one to many relationships in EF CoreEF Core 中一对多关系的自动连接表
【发布时间】:2022-02-07 15:23:48
【问题描述】:

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

我想在事务实体中有一个 Notes 列表导航属性。我不希望 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 表中创建一个外键列。我不希望它这样做,因为会有 4-5 个不同实体中的注释列表,并且我不希望每个实体都有一个外键列。

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

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

有没有一种我不知道的方法,或者在这里更有意义的不同方法?

【问题讨论】:

    标签: .net-core entity-framework-core


    【解决方案1】:

    对于任何感兴趣的人——在玩过这个之后,我发现您实际上可以使用具有拥有实体类型的时态表,并且可以使用拥有的实体类型来自动创建连接表:

    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 的导航属性,而无需创建单独的连接表实体并添加新的DbSet。这似乎是我想要完成的最干净的解决方案。

    【讨论】:

      猜你喜欢
      • 2017-10-26
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      相关资源
      最近更新 更多