EF 6.2外键约束问题:SQLite主键与外键类型不匹配报错13101
解决EF 6.2与SQLite 3类型不匹配的13101错误问题
Hey Doug, 这个问题我之前帮好几个开发者踩过坑,核心就是SQLite的动态类型系统和EF 6.2的严格映射逻辑之间的冲突。
问题根源
SQLite本身是无类型的,但EF 6.2对SQLite的类型映射是“字面匹配”的——它会把INTEGER和int(SQLite里int其实是INT的别名,但EF不认这个等价关系)判定为两种不同的类型,所以当Test表的外键TestTypeId是int,而TestTypes表的主键TestTypeID是INTEGER时,EF就会抛出13101错误,认为类型不匹配。
最优解决方案:统一用INTEGER类型
直接把所有主键和外键都改成INTEGER就对了,原因有两个:
- SQLite里**
INTEGER类型的主键默认自带自增特性**,根本不需要加AUTO_INCREMENT关键字——只要你把字段设为主键,SQLite会自动关联rowid实现自增,完全满足你从SQL Express迁移过来的自增主键需求。 - 统一类型后,EF 6.2会正确识别主键和外键的类型匹配,13101错误自然消失。
为什么不推荐改成带AUTO_INCREMENT的int?
因为SQLite的AUTO_INCREMENT关键字只能用于INTEGER类型的主键,给int类型加这个关键字是无效的,EF依然会识别类型不匹配,等于白忙活一场。
额外验证步骤
修改完数据库结构后,可以做这两步确保没问题:
- 用SQL命令查看表结构:
确认PRAGMA table_info(Test); PRAGMA table_info(TestTypes);TestTypeId和TestTypeID的类型都是INTEGER。 - 检查EF模型:确保对应的.NET属性类型都是
int,更新EDMX或者Code First的映射配置,让EF同步识别新的类型。
这样处理后,你的EF 6.2就能正常和SQLite数据库交互啦。
内容的提问来源于stack exchange,提问作者AeroClassics
相关产品推荐
相关产品推荐

