Entity Framework调用存储过程返回TilesX等列值错误为0的问题
问题根源
- EF 的
Database.SqlQuery<T>原生查询方法不识别[Column]映射特性,只会严格匹配查询结果集的列名和实体类的属性名,你添加的[Column("TilesX")]特性在此场景下完全不生效,只要列名和属性名存在拼写、大小写差异就会映射失败,属性保持默认值0。 - 你当前的存储过程调用写法没有显式指定命令类型为存储过程,部分 EF 版本会将传入的存储过程名当做普通 SQL 文本解析,可能引发未知的映射异常。
- 若存储过程返回的 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
相关产品推荐
相关产品推荐

