You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core 3使用复杂类型时报字段列表未知列错误如何解决

问题解决方案

这个报错是EF Core 3.1嵌套Owned类型的默认列名生成规则与现有数据库列名不匹配,同时EF6的[ComplexType]注解与EF Core的OwnsOne配置存在兼容冲突导致的,具体解决步骤如下:

注意:你之前配置HasColumnName不生效是因为没有在最内层的Parameters属性的Owned配置段下指定,直接在外层AutomatedInvestigation的Property配置是无法识别到嵌套Owned类型的属性的。


方案一:保留拆分列存储(兼容EF6原有表结构)

适合需要对参数内的字段做单独SQL查询的场景

  1. 移除SearchRequestParameters和SearchParameters类上的[ComplexType]注解,仅使用Fluent API做Owned配置,避免配置冲突
  2. 显式为嵌套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");
    });
});
  1. 如果你使用Devart MySQL驱动的默认命名规则,可在DbContext配置中添加兼容配置,避免后续其他Owned类型出现同类问题:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseMySql("你的数据库连接字符串", mysqlBuilder => 
    {
        mysqlBuilder.UseLegacyComplexTypeNaming();
    });
    // 其他原有配置
}

方案二:改为JSON列存储(更简洁)

适合不需要对参数内的字段做单独SQL查询的场景,无需配置嵌套Owned类型

  1. 移除原有OwnsOne相关的所有配置
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:24:08