EF Core 3使用复杂类型时报字段列表未知列错误如何解决
问题解决方案
这个报错是EF Core 3.1嵌套Owned类型的默认列名生成规则与现有数据库列名不匹配,同时EF6的[ComplexType]注解与EF Core的OwnsOne配置存在兼容冲突导致的,具体解决步骤如下:
注意:你之前配置HasColumnName不生效是因为没有在最内层的
Parameters属性的Owned配置段下指定,直接在外层AutomatedInvestigation的Property配置是无法识别到嵌套Owned类型的属性的。
方案一:保留拆分列存储(兼容EF6原有表结构)
适合需要对参数内的字段做单独SQL查询的场景
- 移除
SearchRequestParameters和SearchParameters类上的[ComplexType]注解,仅使用Fluent API做Owned配置,避免配置冲突 - 显式为嵌套Owned类型的每个属性指定数据库实际对应的列名,修改你的
BuildAutomationInvestigationModel方法中的Owned配置段:
entityTypeBuilder.OwnsOne(s => s.SearchParameters, sa => { // 显式忽略不需要映射的Serialized属性 sa.Ignore(x => x.Serialized); sa.OwnsOne(p => p.Parameters, pa => { // 括号内的值替换为你表中实际对应的列名即可 pa.Property(p => p.FirstName).HasColumnName("search_parameters_first_name"); pa.Property(p => p.LastName).HasColumnName("search_parameters_last_name"); pa.Property(p => p.DOB).HasColumnName("search_parameters_dob"); pa.Property(p => p.State).HasColumnName("search_parameters_state"); }); });
- 如果你使用Devart MySQL驱动的默认命名规则,可在DbContext配置中添加兼容配置,避免后续其他Owned类型出现同类问题:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseMySql("你的数据库连接字符串", mysqlBuilder => { mysqlBuilder.UseLegacyComplexTypeNaming(); }); // 其他原有配置 }
方案二:改为JSON列存储(更简洁)
适合不需要对参数内的字段做单独SQL查询的场景,无需配置嵌套Owned类型
- 移除原有
OwnsOne相关的所有配置 - 在
MapProperties扩展方法中添加以下配置:
entityTypeBuilder.Property(p => p.SearchParameters) .HasColumnName("search_parameters") .HasColumnType("json") .HasConversion( serializeObj => JsonConvert.SerializeObject(serializeObj.Parameters), deserializeStr => new SearchRequestParameters { Serialized = deserializeStr } );
两种方案均可解决当前列找不到的报错,可根据你的业务需求选择。
内容的提问来源于stack exchange,提问作者Aj Grandeza
相关产品推荐
相关产品推荐

