实体框架+优势数据库:UDF

时间:2010-08-24 20:55:21

标签: entity-framework-4 advantage-database-server

我在我的应用程序中使用VS2010,Entity Framework 4.0和Advantage v.10。我正在尝试将我在Advantage DB中定义的UDF用于我的应用程序代码。设计器不会像我期望的那样在“从数据库更新模型”向导中显示存储过程下的UDF。所以我手动将UDF添加到SSDL中,如下所示:

    <Function Name="Test" ReturnType="numeric" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion">
      <Parameter Name="PartID" Type="integer" Mode="In"/>
    </Function>

我还添加了一个CLR方法存根:

    [EdmFunction("namespace.Store", "Test")]
    public static decimal Test(int partID)
    {
        throw new InvalidOperationException("Call from within an L2E query");
    }

我可以在Linq-to-Entities语句中看到该函数;但是,生成的SQL无效。使用ToTraceString,UDF调用看起来像这样:

    "namespace.Store"."Test"("Project3"."PartID") AS "C4"

这给了我以下错误:

System.Data.EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参阅内部异常---&GT; Advantage.Data.Provider.AdsException:错误7200:AQE错误:状态= 42000; NativeError = 2117; [iAnywhere Solutions] [Advantage SQL Engine]意外的令牌:标量函数名称不应该被分隔。

如果我在Advantage Data Architect中运行生成的SQL并更正函数名称,它可以正常工作:

     Test("Project3"."PartID") AS "C4"

有没有告诉实体框架生成正确的SQL?我在SSDL中定义函数时做错了吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

看起来不错。我唯一建议的是将小数改为可以为空,但我怀疑这会解决问题,因为那时你会看到一个不同的异常。值得一试。我一会儿就覆盖了这个功能。

http://weblogs.asp.net/zeeshanhirani/archive/2010/04/08/calling-user-defined-database-function-from-linq.aspx

答案 1 :(得分:0)

您需要将功能元素更改为BuiltIn="true"。用户定义的函数未在Advantage SQL语法中引用。