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 生成的列名称如下:
- ChartId
- ChartId1
- ChartId2
- ChartId3
...我如何告诉 EF Core 5 将 ChartField 列名称更改为类似以下内容:
- ChartId_MainChart
- ChartId_SecondaryChart
- ChartId_ExtraChart
- ChartId_AnotherOne
是否有注释或方法来覆盖外键列名称?
有几种方法可以做到这一点。通常这些配置在关系的“一”侧(生成实际 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
等等
在 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 生成的列名称如下:
- ChartId
- ChartId1
- ChartId2
- ChartId3
...我如何告诉 EF Core 5 将 ChartField 列名称更改为类似以下内容:
- ChartId_MainChart
- ChartId_SecondaryChart
- ChartId_ExtraChart
- ChartId_AnotherOne
是否有注释或方法来覆盖外键列名称?
有几种方法可以做到这一点。通常这些配置在关系的“一”侧(生成实际 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
等等