实体框架 - 尝试调用参数化函数时出错

时间:2012-08-23 10:37:58

标签: entity-framework entity-framework-4 oracle11g

我已经映射了一些函数,它被用作其中一个Oracle函数的包装器(我真的需要从我的LINQ中调用该Oracle函数)。

我的映射看起来像(存储模型):

<Function Name="RunTranslate" IsComposable="false" BuiltIn="false">
    <CommandText>
        SELECT Translate(@DataToTranslate using char_cs) AS ResultData FROM dual
    </CommandText>
    <Parameter Name="DataToTranslate" Type="char" Mode="In" />
</Function>

<FunctionImport Name="OracleTranslate" ReturnType="Collection(String)">
    <Parameter Name="DataToTranslate" Mode="In" Type="String" />
</FunctionImport>

我尝试以这种方式使用代码:

using (var context = new TestEntities())
{
    ....

    var result = from myData in context.OracleTranslate("test")
                 select myData;    // Error ORA-00936!
    ....
}

我尝试使用Entity Framework Profiler(EFProf)来查看实际发送到数据库的查询。截获的查询是下一个:

SELECT Translate('test' /*@DataToTranslate*/ using char_cs) AS ResultData FROM dual

(看起来很好)

但我的应用程序因下一个错误而停止: ORA-00936:表达式缺失

如果我将截获的查询复制粘贴到VS2010的服务器资源管理器查询窗口中 - 它可以工作! DB向我返回正确的数据!

那么,问题出在哪里?在我的情况下代码和查询窗口有什么区别?我以为他们使用相同的提供商等...

非常感谢!

修改

我刚刚使用标准的Inet-sniffer来检查在运行查询时通过套接字和Internet发送的真实数据。

与第一个不一样!这正是我的源SQL查询:

SELECT Translate(使用char_cs的@DataToTranslate)AS ResultData FROM dual

看来,该参数无法识别,但为什么?

1 个答案:

答案 0 :(得分:1)

我找到了解决方案,希望这些信息可以帮到某人:

DataToTranslate参数应使用冒号(“:DataToTranslate”)映射,而不是“@”。

另一个重要经验(对我来说):实体框架分析器(EFProf)显示它想要的东西,而不是真实数据 - 使用像Wireshark这样的TCP嗅探器来查看数据要好得多。