F#项目中SQLProvider Guid转String类型转换异常求助
解决SQLProvider中Guid与String类型转换异常问题
问题原因
你的MySQL表中Id列定义为char(36),SQLProvider默认会将这种长度的字符列推断为Guid类型(匹配GUID字符串的标准长度),但查询代码中使用string类型与c.Id(Guid类型)进行比较,运行时因类型不匹配抛出转换异常。
解决方案
方案一:调整代码使用Guid类型处理Id
直接将代码中的Id参数和比较逻辑改为Guid类型,消除类型不匹配:
修改查询函数:
let getById (id: Guid) = query { for c in ComicsTable do where (c.Id = id) select c.Id } |> Seq.head
调用时将字符串转为Guid:
let result = getById (Guid.Parse("0e49d94e-76c4-44be-b2ea-38382b297c78")) Console.WriteLine(result)
如果需要保留string参数,可在函数内部先转换为Guid:
let getById (id: string) = let guidId = Guid.Parse(id) query { for c in ComicsTable do where (c.Id = guidId) select c.Id } |> Seq.head
方案二:配置SQLProvider强制映射为String类型
通过SQLProvider的连接配置,指定将char(36)类型列映射为string,生成的实体类中Id属性将直接为string类型,与代码逻辑匹配:
在连接字符串中添加TypeMap参数:
let connectionString = "Server=localhost;Database=ComicsShop;Uid=your_user;Pwd=your_pass;TypeMap=char(36)=System.String" let sql = SqlDataProvider<Common.DatabaseProviderTypes.MYSQL, connectionString>
或者在项目的app.config中配置:
<connectionStrings> <add name="ComicsShop" connectionString="Server=localhost;Database=ComicsShop;Uid=your_user;Pwd=your_pass;TypeMap=char(36)=System.String" providerName="MySqlConnector" /> </connectionStrings>
配置完成后重新生成类型,即可直接用string类型处理Id列。
内容的提问来源于stack exchange,提问作者Artem Halas
相关产品推荐
相关产品推荐

