防止ODP.net将字符串国有化
本文关键字:字符串 国有化 net ODP 防止 | 更新日期: 2023-09-27 17:52:56
我使用ODP.net与EntityFramework 6。我有一个问题与一个大的where子句linq请求。
var preResult = _context.table1.Where(item => item.natid != 7).Where(inc => inc.nat.Name.Contains(searchValue)
|| inc.Datedet.ToString("dd/MM/yyy").Contains(searchValue)
... (omited for brievity)
|| inc.nb.ToString().Contains(searchValue)
).Skip(start).Take(length);
问题是由于ORA-12704:字符集不匹配而生成的查询失败,原因是:
...((((CASE WHEN ("Extent4"."YYYY" IS NULL) THEN N'' ELSE "Extent4"."ZZZZ" END)||(' - ')))||(CASE WHEN ("Extent4"."XXXX" IS NULL) THEN N'' ELSE "Extent4"."XXXX" END)) AS "C2",...
如果我用 " 替换N " ,请求工作并返回良好的结果。
我目前的解决方案是使用IDbCommandInterceptor来像上面那样使用 readerexecution 进行全局替换,但我认为这有点极端。
你有更好的解决方案吗?
默认情况下,字符串类型的实体属性将映射到国家字符集。
你可以重新配置每个属性的行为。这应该能解决你的问题。
查看此链接获取更多信息:https://msdn.microsoft.com/en-us/data/jj591617#1.9
复制粘贴感兴趣的部分:
配置字符串属性是否支持Unicode Content
默认字符串是Unicode (SQL Server中的nvarchar)。你可以使用IsUnicode方法来指定一个字符串应该是varchar类型。
modelBuilder.Entity<Department>()
.Property(t => t.Name)
.IsUnicode(false);
我遇到了同样的问题,有两种解决方案:
- 你可以在查询中添加EntityFunctions.AsNonUnicode():
inc.nat.Name.Contains(EntityFunctions.AsNonUnicode(searchValue))
它将强制odp.net使用非unicode字符
- Update your oracle provider, odac 12c修复此问题:https://community.oracle.com/message/11065799#11065799