EF Core 5 - 如何更改自动生成的外键列名称?

EF Core 5 - how to change auto-generated foreign key column name?

在 EF Core 5 中,我有一个名为 Chart 的 class,它具有以下 4 个属性:

        public virtual ICollection<ChartField> Filters { get; set; }

        public virtual ICollection<ChartField> HiddenFilters { get; set; }

        public virtual ICollection<ChartField> AddAllFilters { get; set; }

        public virtual ICollection<ChartField> Series { get; set; }

... ChartField table 生成的列名称如下:

...我如何告诉 EF Core 5 将 ChartField 列名称更改为类似以下内容:

是否有注释或方法来覆盖外键列名称?

有几种方法可以做到这一点。通常这些配置在关系的“一”侧(生成实际 FK 的地方)- 在显式 FK 属性 或参考导航 属性.

您还没有显示另一个 class,因此假设那里没有 FK/reference 导航属性,最简单的方法是在集合导航属性上应用 [ForeignKey] 属性。例如


[ForeignKey("ChartId_MainChart")]
public virtual ICollection<ChartField> Filters { get; set; }

[ForeignKey("ChartId_SecondaryChart")]
public virtual ICollection<ChartField> HiddenFilters { get; set; }

[ForeignKey("ChartId_ExtraChart")]
public virtual ICollection<ChartField> AddAllFilters { get; set; }

[ForeignKey("ChartId_AnotherOne")]
public virtual ICollection<ChartField> Series { get; set; }

当然一样可以配置流畅。例如

modelBuilder.Entity<Chart>()
    .HasMany(e => e.Filters)
    .WithOne()
    .HasForeignKey("ChartId_MainChart");

其他类似

modelBuilder.Entity<Chart>()
    .HasMany(e => e.HiddenFilters)
    .WithOne()
    .HasForeignKey("ChartId_SecondaryChart");

modelBuilder.Entity<Chart>()
    .HasMany(e => e.AddAllFilters)
    .WithOne()
    .HasForeignKey("ChartId_ExtraChart");

modelBuilder.Entity<Chart>()
    .HasMany(e => e.Series)
    .WithOne()
    .HasForeignKey("ChartId_AnotherOne");

这更冗长,但更灵活且不易出错。还允许您为影子 FK 属性 和关联的数据库列配置不同的名称。例如

modelBuilder.Entity<Chart>()
    .HasMany(e => e.Filters)
    .WithOne()
    .HasForeignKey("MainChartId"); // FK shadow property name

modelBuilder.Entity<ChartField>()
    .Property("MainChartId")
    .HasColumnName("ChartId_MainChart"); // FK column name

等等