防止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 进行全局替换,但我认为这有点极端。

你有更好的解决方案吗?

防止ODP.net将字符串国有化

默认情况下,字符串类型的实体属性将映射到国家字符集。

你可以重新配置每个属性的行为。这应该能解决你的问题。

查看此链接获取更多信息: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