2010-08-24 115 views
0

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

<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到实体声明的功能;但是,生成的SQL无效。使用ToTraceString的UDF调用看起来是这样的:

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

这给了我下面的错误:

System.Data.EntityCommandExecutionException:执行命令定义时出错。详情请参阅内部例外。 ---> Advantage.Data.Provider.AdsException:错误7200:AQE错误:状态= 42000; NativeError = 2117; [iAnywhere解决方案] [优势SQL引擎]意外的标记:不应分隔标量函数名称。

如果我运行优势Data Architect中生成的SQL和纠正功能名称,像这样它工作正常:

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

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

在此先感谢。

回答

0

你需要改变你的函数元素有BuiltIn="true"。用户定义函数不在Advantage SQL语法中引用。

+0

我尝试了很多属性的不同组合,但我认为BuiltIn意味着原生的系统DB功能。好东西! – user429994 2010-08-26 13:42:22