在构建Linq-to-Sql代码时强制实体框架不生成NCLOB(模型优先)

时间:2017-07-19 00:28:32

标签: c# oracle entity-framework linq linq-to-sql

我有一个带有可空int属性的类,出于过滤原因,我需要转换为字符串来进行一些比较。我安装了EF 6.1.2,因此使用.ToString()将适用于此。

queryableData = queryableData.Where(a => 
    a.PropName.HasValue && a.PropName.Value.ToString().Contains("8675309"));

在检查正在执行的实际SQL时,该数字正在被CAST转换为NCLOB类型,这会导致以下错误:

  

ORA-00932:不一致的数据类型:预期的NCHAR - 得到NCLOB

从我读过的内容来看,这是因为Entity在这种情况下并不知道潜在的最大大小,所以它默认为最大的选项。我知道有一个字符串属性,我可以表示最大大小来帮助。在将属性保持为int以防止NCLOB被使用时,我能做些什么吗?或者在防止此异常时使用它们的方法?

其他一些说明:

  • 我在Oracle系统上,所以SqlFunctions.StringConvert已经用完。
  • 我在Odp.net版本12.x(与this post相关)。
  • EF是模型优先方法。
  • .Where()子句被添加到AsQueryable()中,因此我无法在内存中执行任何操作。

1 个答案:

答案 0 :(得分:1)

我在Oracle( Oracle 11.2.02和Oracle.ManagedDataAccess.12.2.1100 )和实体框架( EntityFramework.6.1.3 )中遇到了同样的问题。< / p>

这内部Linq代码(属性“Id”是整数):

Material.Id.ToString()

生成此SQL:

(CASE WHEN ("Extent3"."Material_Id" IS NULL) THEN N'' ELSE TO_NCLOB("Extent3"."Material_Id") END)

问题是 TO_NCLOB ,它应该是 TO_NCHAR

<强>解决方案
JonathanPeel comment
Install-Package EntityFramework.Functions