如何移除EF Core中Owned类型映射生成的数据库列名前缀
问题原因
这是EF Core的Owned实体列名默认约定导致的:为了避免不同Owned实体的属性名冲突,EF Core默认会给Owned实体的列名自动拼接前缀,优先级为「所有者实体名_属性名」>「导航属性名_属性名」,所以你在嵌套配置里指定HasColumnName("Name")后,还是被约定自动加上了Company_前缀,最终生成Company_Name列。
解决方案
方案1:仅针对当前列单独配置(推荐,不影响全局规则)
不需要修改嵌套的Owned配置,直接在Company根实体的配置上显式指定嵌套属性的列名即可,该配置优先级高于默认约定,不会被自动加前缀:
builder.OwnsOne(company => company.MainDetails); // 直接指定嵌套属性的最终列名 builder.Property(company => company.MainDetails.Name) .HasColumnName("Name");
方案2:全局关闭Owned实体列名前缀(适合全项目所有Owned实体都不需要前缀的场景)
如果你项目内所有Owned实体的属性都不需要自动拼接前缀,可以在OnModelCreating方法开头全局设置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 全局配置Owned实体列名不添加前缀 modelBuilder.Model.SetOwnedTypesPrefix(null); // 其余实体配置保持不变即可 modelBuilder.Entity<Company>(builder => { builder.OwnsOne(company => company.MainDetails); }); }
注:
SetOwnedTypesPrefix是EF Core 6及以上版本提供的API,如果你使用的是更低版本,可以替换为移除对应约定的代码:modelBuilder.Conventions.Remove<OwnedTypeColumnNamePrefixConvention>();
内容的提问来源于stack exchange,提问作者Bassie
相关产品推荐
相关产品推荐

