M1 Mac Parallels环境下EF Core读取SQL Server Express报类型转换错误
解决M1 Mac Parallels中SQL Server Express + EF Core的类型转换错误
以下是几个经过验证的排查和解决方向:
检查数据库排序规则与编码一致性
远程数据库和本地Parallels中的SQL Server实例可能使用不同的排序规则,即便列类型都是nvarchar,也可能导致EF Core读取时将底层存储的二进制数据误判为字符串。
先对比两者的排序规则:SELECT name, collation_name FROM sys.databases WHERE name = '你的数据库名称'如果本地库排序规则和远程不一致,修改本地库的排序规则(操作前务必备份数据):
ALTER DATABASE 你的数据库名称 COLLATE 远程库的排序规则名称;校验EF Core模型映射配置
有可能模型中的字符串属性被错误配置,或者自动生成的模型和实际数据库列不匹配:- 检查Fluent API配置,确保所有字符串属性都明确指定了
nvarchar类型,比如:modelBuilder.Entity<你的实体类>() .Property(p => p.你的字符串属性) .HasColumnType("nvarchar(255)"); - 用
Scaffold-DbContext命令重新生成模型,对比原有模型是否存在属性类型错误(比如被误生成byte[]类型)。
- 检查Fluent API配置,确保所有字符串属性都明确指定了
调整SQL Server兼容性级别
本地SQL Server实例的兼容性级别如果低于远程数据库,可能导致数据存储格式差异:
查询远程库兼容性级别:SELECT name, compatibility_level FROM sys.databases WHERE name = '远程数据库名称'将本地库设置为相同级别(比如150对应SQL Server 2019):
ALTER DATABASE 你的数据库名称 SET COMPATIBILITY_LEVEL = 150;重新备份还原数据库
备份还原过程中可能出现数据损坏,导致nvarchar列被写入二进制数据:- 重新从远程库生成完整备份,确保备份文件无损坏;
- 尝试用SQL Server的生成脚本功能(包含所有数据),在本地实例重新创建数据库,替代直接还原备份的方式。
内容的提问来源于stack exchange,提问作者HKiernan
相关产品推荐
相关产品推荐

