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



在EF Core 5中,我有一个名为Chart的类它有以下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表的列名如下所示:

  • ChartId
  • ChartId1
  • ChartId2
  • ChartId3

…我如何告诉EF Core 5将ChartField列名更改为如下内容:

  • ChartId_MainChart
  • ChartId_SecondaryChart
  • ChartId_ExtraChart
  • ChartId_AnotherOne

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

有几种方法可以做到这一点。通常这些都在"1"处配置。关系的一侧(生成实际FK的地方)——要么在显式FK属性上,要么在引用导航属性上。

您没有显示另一个类,因此假设那里没有FK/引用导航属性,最简单的方法是在集合导航属性上应用[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");

这更冗长,但更灵活,更不容易出错。还允许您为shadow FK属性和关联的db列配置不同的名称。例如

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

等。

最新更新