使用Dapper.F#查询实体时报错缺少匹配构造函数如何解决
问题根因
你遇到的报错本质是Dapper对F#记录类型的默认映射规则和当前字段顺序不匹配导致的:
- 你定义的
session记录字段顺序为:id -> session_id -> clerk_json -> clerk_id -> expires - 用
SELECT *查询时,数据库返回的列顺序是表结构定义的顺序:id -> session_id -> clerk_id -> clerk_json -> expires(和错误提示里要求的构造函数参数顺序完全一致)
Dapper默认映射F#记录时,会优先按返回列的位置顺序匹配记录构造函数的参数顺序,仅当顺序完全匹配时才会校验字段名,顺序不一致时就会抛出找不到匹配构造函数的错误,和字段名、字段类型是否一致无关。
解决方案
方案1:调整记录字段顺序(成本最低)
直接修改session类型的定义,让字段顺序和数据库表的字段顺序对齐即可:
module Session type session = {id: int; session_id: string; clerk_id: int; clerk_json: string; expires: int}
方案2:显式指定查询列顺序
不需要修改记录定义的前提下,写查询时避免用SELECT *,手动指定列的顺序和你的记录字段顺序匹配即可,顺便可以把你硬编码的固定ID替换为SCOPE_IDENTITY(),正确拿到当前会话最后插入的记录ID:
let result = connection.Query<'a>($"""Select id, session_id, clerk_json, clerk_id, expires From {table} Where id = SCOPE_IDENTITY()""") |> EnumerableToArray
方案3:全局配置Dapper按字段名匹配
如果不想每次都处理顺序问题,可以在程序启动时全局配置Dapper的类型映射规则,强制按字段名匹配,忽略列顺序:
// 全局配置,执行一次即可 Dapper.SqlMapper.DefaultTypeMap <- Dapper.DefaultTypeMap.MatchNamesWithUnderscores // 适配F#可选类型的额外配置(部分版本Dapper需要) Dapper.FSharp.OptionTypes.register ()
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

