EF Core拥有实体含外键映射报错:无效列名Customer_city_id
EF Core外键列名错误修正方案
问题背景
需将Order与Customer作为拥有实体映射至同一张表tbl_customers,Customer包含指向City的外键。配置时出现错误:Invalid column name 'Customer_city_id',且无法修改实体类与数据库表结构,仅能调整DbContext配置。
错误原因
EF Core默认会为Owned Entity的导航属性生成带所有者前缀的外键列名(如Customer_city_id),但数据库表中实际使用的是无前缀的列名(如city_id),导致列名不匹配。
修正后的DbContext代码
public class EntityContext: DbContext { public DbSet<Order> Orders { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder .UseSqlServer("myConnectionString"); protected override void OnModelCreating(ModelBuilder modelBuilder) { // City实体映射配置 modelBuilder.Entity<City>(c => { c.ToTable("tbl_city") .HasKey(c => c.Id); c.Property(c => c.Id) .HasColumnName("city"); c.Property(c => c.Name) .HasColumnName("city_desc"); c.Property(c => c.District) .HasColumnName("dist"); }); // Order及关联的Customer(Owned Entity)映射配置 modelBuilder.Entity<Order>(c => { c.ToTable("tbl_customers"); c.Property(c => c.Id).HasColumnName("id"); c.OwnsOne(p => p.Customer, s => { s.Property(c => c.Id) .HasColumnName("customer_id"); s.Property(c => c.FirstName) .HasColumnName("customer_first_name"); s.Property(c => c.LastName) .HasColumnName("customer_last_name"); // 正确配置Customer与City的外键关联 s.HasOne(c => c.City) .WithMany() // City无反向导航属性,使用空参数重载 .HasForeignKey("city_id"); // 指定数据库中实际的外键列名 }); }); } }
关键修改点
- 显式绑定导航属性:使用
s.HasOne(c => c.City)而非泛型的HasOne<City>,让EF Core明确识别Customer实体中的City导航属性,避免自动生成带前缀的列名。 - 指定真实外键列名:通过
HasForeignKey("city_id")直接指定数据库表中存在的外键列名,覆盖EF Core的默认命名规则。 - 反向导航适配:由于City实体中没有指向Customer的反向导航属性,使用
WithMany()的无参数重载即可完成配置。
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

