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

Entity Framework调用存储过程返回TilesX等列值错误为0的问题

问题根源

  1. EF 的 Database.SqlQuery<T> 原生查询方法不识别 [Column] 映射特性,只会严格匹配查询结果集的列名和实体类的属性名,你添加的 [Column("TilesX")] 特性在此场景下完全不生效,只要列名和属性名存在拼写、大小写差异就会映射失败,属性保持默认值0。
  2. 你当前的存储过程调用写法没有显式指定命令类型为存储过程,部分 EF 版本会将传入的存储过程名当做普通 SQL 文本解析,可能引发未知的映射异常。
  3. 若存储过程返回的 TilesX、TilesY 列是默认的 int 整数类型,实体类属性使用 ushort 会触发 EF 类型转换逻辑失效,导致赋值失败返回0。

修复步骤

  • 修正存储过程调用写法,显式标记为存储过程调用:
public static List<USP_Get_TilesetInformation> USP_Get_TilesetInformation()
{
    return new DefaultContext().Database.SqlQuery<USP_Get_TilesetInformation>(
        "EXEC USP_Get_TilesetInformation"
    ).ToList();
}

如果仍有异常可以改用更稳定的命令指定写法:

public static List<USP_Get_TilesetInformation> USP_Get_TilesetInformation()
{
    using var context = new DefaultContext();
    context.Database.Connection.Open();
    using var cmd = context.Database.Connection.CreateCommand();
    cmd.CommandText = "USP_Get_TilesetInformation";
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    using var reader = cmd.ExecuteReader();
    return ((IObjectContextAdapter)context).ObjectContext
        .Translate<USP_Get_TilesetInformation>(reader)
        .ToList();
}
  • 移除无效的 [Column] 特性,确保存储过程返回的 TilesX、TilesY 列名和实体类属性名完全一致,大小写也要对齐(部分数据库对列名大小写敏感)。
  • 先将实体类中 TilesX、TilesY 的属性类型从 ushort 改为 int,和数据库返回的整数类型对齐,验证映射正常后如果需要再自行转换为 ushort 类型。

内容的提问来源于stack exchange,提问作者Sythnet Partridge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 14:12:04