EF Core Code First一对一关系中如何自定义关联外键的数据库列名
EF Core 3.1 自定义一对一关联外键列名解决方案
你遇到的问题根本原因是:[Column] 注解直接标注在导航属性上不会生效,EF Core 3.1 默认会按照「导航属性名+关联实体主键名」的规则生成外键列名,因此你配置的State导航属性会生成StateIdState的列名,可通过以下两种方案解决:
方案一:显式声明外键属性(注解方式,推荐)
直接在City实体中新增外键属性,搭配[ForeignKey]注解关联导航属性即可,代码示例:
public class City { [Column("IdCity")] public short IdCity { get; set; } // 显式定义外键属性,用Column指定实际数据库列名 [Column("IdState")] public byte IdState { get; set; } // 标注该导航属性的外键为上面的IdState属性 [ForeignKey(nameof(IdState))] public State State { get; set; } } public class State { [Column("IdState")] public byte IdState { get; set; } }
该方案改动最小,符合EF Core的约定配置规则,后续维护也更直观。
方案二:使用Fluent API配置(无需修改实体结构)
如果你不想在实体中新增显式外键属性,可以在DbContext的OnModelCreating方法中配置阴影外键的列名,代码示例:
public class YourDbContext : DbContext { // 其余配置省略 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<City>() .HasOne(c => c.State) // 如果State实体有反向导航到City的集合属性,这里改为.WithMany(s => s.Cities) .WithMany() // 定义阴影外键的属性名 .HasForeignKey("IdState") // 指定外键对应的数据库物理列名 .HasColumnName("IdState"); } }
配置完成后删除之前的错误迁移,重新生成迁移并更新数据库,就能得到你需要的IdState外键列。
内容的提问来源于stack exchange,提问作者Mauro Alvarez
相关产品推荐
相关产品推荐

