Entity Framework内存模式下HasComputedColumnSql含REPLICATE函数单元测试报错咨询
问题解答
这不是Entity Framework计算列本身的限制,问题出在你单元测试用的SQLite内存数据库不支持SQL Server专属的REPLICATE函数。
核心原因是不同数据库的内置函数体系不通用:
- SQL Server有
REPLICATE用来重复字符串,但SQLite里对应的函数是REPEAT,而且SQLite获取字符串长度用LENGTH(和SQL Server的LEN功能相近,但空值处理有细微差别); - 另外SQLite的字符串连接优先用
||,虽然也支持CONCAT,但写法上要注意适配。
解决办法有两种:
- 针对不同数据库做分支配置
在OnModelCreating里判断当前使用的数据库类型,分别写对应的计算列SQL:if (Database.IsSqlServer()) { entity.Property(f => f.Barcode).HasComputedColumnSql("[Prefix]+CONCAT(REPLICATE('0',(4)-LEN([ContainerId])),[ContainerId])"); } else if (Database.IsSqlite()) { entity.Property(f => f.Barcode).HasComputedColumnSql("[Prefix] || CONCAT(REPEAT('0', (4) - LENGTH([ContainerId])), [ContainerId])"); } - 单元测试改用SQL Server本地实例
比如用SQL Server LocalDB,这样就能直接复用SQL Server的计算列语法,不用适配SQLite的函数。
补充说明:EF的HasComputedColumnSql是直接把你写的SQL片段传给数据库执行的,所以必须符合当前数据库的语法规范,不存在所谓“EF内存模式限制计算列”的问题,本质就是跨数据库的SQL语法不兼容。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

