C# Entity Framework 6.1.3和Oracle在非统一代码列上生成具有Unicode的sql

C# Entity Framework 6.1.3和Oracle在非统一代码列上生成具有Unicode的sql,c#,oracle,entity-framework,unicode,C#,Oracle,Entity Framework,Unicode,我将实体框架6.1.3与Oracle ManagedDataAccess 12.1.022和Oracle.ManagedDataAccess.EntityFramework 12.1.022(NuGet软件包)一起使用(图1)。我的项目首先是一个数据库,并将模型导入运行T4代码的.edmx文件 图1 数据库使用varchar2列,并且.edmx文件将它们识别为非一致代码。(图2和图3) 图2。 图3 运行查询时,我收到一个oracle错误ORA-12704:字符集不匹配。以下是查询: var

我将实体框架6.1.3与Oracle ManagedDataAccess 12.1.022和Oracle.ManagedDataAccess.EntityFramework 12.1.022(NuGet软件包)一起使用(图1)。我的项目首先是一个数据库,并将模型导入运行T4代码的
.edmx
文件

图1

数据库使用
varchar2
列,并且
.edmx
文件将它们识别为非一致代码。(图2和图3)

图2。

图3

运行查询时,我收到一个oracle错误
ORA-12704:字符集不匹配
。以下是查询:

var emp2 = db.EMPLOYEEs
                .Where(s => s.FIRST_NM.ToUpper().StartsWith(term.ToUpper()) || s.LAST_NM.ToUpper().StartsWith(term.ToUpper()))
                .Select(c => new
                 {
                     label = c.FIRST_NM + " " + c.LAST_NM,
                     value = c.FIRST_NM + " " + c.LAST_NM
                 });
使用
.ToTraceString()
我可以看到正在发送的sql是:

SELECT 
1 AS "C1", 
((((CASE WHEN ("Extent1"."FIRST_NM" IS NULL) THEN N'' /* Unicode here for null value */
ELSE "Extent1"."FIRST_NM" END)||(' ')))||(CASE WHEN ("Extent1"."LAST_NM" IS NULL) THEN N''
 ELSE "Extent1"."LAST_NM" END)) AS "C2", 
((((CASE WHEN ("Extent1"."FIRST_NM" IS NULL) THEN N'' ELSE "Extent1"."FIRST_NM" END)||(' ')))||(CASE WHEN ("Extent1"."LAST_NM" IS NULL) THEN N'' ELSE "Extent1"."LAST_NM" END)) AS "C3"
FROM "RISKMGMT"."EMPLOYEE" "Extent1"
WHERE ((( NVL(INSTR(UPPER("Extent1"."FIRST_NM"), UPPER(:p__linq__0)), 0) ) = 1) OR (( NVL(INSTR(UPPER("Extent1"."LAST_NM"), UPPER(:p__linq__1)), 0) ) = 1))
 /** parameters **/ 
 p__linq__0[System.String] = j

 /** parameters **/ 
 p__linq__1[System.String] = j

select子句的
N'
部分导致错误。如果我删除
N
,查询将工作。我通过搜索发现,这是EF4中的一个问题,但目前没有。你知道为什么会发生这种情况吗?有没有一种方法可以修复这种情况,使生成的SQL不是Unicode的

我可以通过将查询拆分为两个不同的部分并在第一个
where
子句的末尾添加一个
.ToArray()
来解决这个问题。我想返回一个JSON对象,所以这是我的解决方案

db.EMPLOYEEs
  .Where(s => s.FIRST_NM.ToUpper().StartsWith(term.ToUpper())
           || s.LAST_NM.ToUpper().StartsWith(term.ToUpper()))
 .ToArray();
然后格式化JSON对象:

return Json(matching.Select(m => new
        {
            id = m.EMPLID,
            value = m.FIRST_NM + " " + m.LAST_NM,
            label = String.Concat(m.FIRST_NM, " ", m.LAST_NM),
        }), JsonRequestBehavior.AllowGet);

您的型号上有Unicode设置吗?对我更新了图3,以显示底部的Unicode属性设置为false。我在查询中遇到了Unicode字符的问题,更新oracle提供程序解决了这个问题。请尝试odac 12c或更高版本。