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

Posted

技术标签:

【中文标题】实体框架+优势数据库:UDFs【英文标题】:entity framework + advantage database: UDFs 【发布时间】:2010-08-24 20:55:20 【问题描述】:

我在我的应用程序中使用 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:执行命令定义时出错。有关详细信息,请参阅内部异常。 ---> Advantage.Data.Provider.AdsException:错误 7200:AQE 错误:状态 = 42000;本机错误 = 2117; [iAnywhere Solutions][Adv​​antage SQL Engine]Unexpected token: Scalar function name should not be delimited.

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

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

有没有办法告诉 Entity Framework 生成正确的 SQL?我在 SSDL 中的函数定义中做错了吗?

提前致谢。

【问题讨论】:

【参考方案1】:

您需要将函数元素更改为具有BuiltIn="true"。 Advantage SQL 语法中没有引用用户定义函数。

【讨论】:

我尝试了很多不同的属性组合,但我认为 BuiltIn 意味着本机的系统数据库功能。好东西!【参考方案2】:

看起来不错。我唯一建议的是将小数更改为可为空,但我怀疑这会解决问题,因为那样你会看到一个不同的异常。这值得一试。不久前我确实介绍了该功能。

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

【讨论】:

以上是关于实体框架+优势数据库:UDFs的主要内容,如果未能解决你的问题,请参考以下文章

Rafy 领域实体框架简介

实体框架和业务对象

如何在多列上执行 udfs - 动态

使用T4模板为EF框架添加实体根据数据库自动生成字段注释的功能

Hive之UDFs(User-Defined Functions )

我们可以使用 Pig Udfs 拆分 PDF 文件吗?