【问题标题】:Custom SQL functions and Code First (EF 4.1)自定义 SQL 函数和代码优先 (EF 4.1)
【发布时间】:2011-07-28 10:32:40
【问题描述】:

我正在使用 Entity Framework 4.1 RC 和代码优先方法。 如何调用自定义 SQL 函数?

如果我使用 EdmFunction 属性,我应该指定什么命名空间?

[EdmFunction("Namespace", "GetAge")] 
public static int GetAge(Person p) 
{  
    throw new NotSupportedException(…); 
}

当我尝试使用此类函数执行 LINQ 查询时,会引发以下异常:

类型上指定的方法'...' '...' 不能被翻译成 LINQ to 实体存储表达式。

【问题讨论】:

    标签: .net entity-framework entity-framework-4.1


    【解决方案1】:

    如果要调用 SQL 函数,则必须执行自定义 SQL 查询。为此,请使用 context.Database.SqlQuery。实体框架支持存储过程的映射,但 DbContext API (EF 4.1) 不支持此功能。如果要调用存储过程,则必须再次使用 context.Database.SqlQuery。存储过程永远不能在 Linq 查询中使用。

    EdmFunction 是 ObjectContext API 和实体设计器的功能。命名空间设置为 EDMX 文件中定义的命名空间。使用代码优先时,您没有 EDMX 文件,也无法定义函数映射。

    顺便说一句。如果您遵循代码优先的方法,您不应该有任何存储过程或 SQL 函数,因为您的数据库是由您的模型(代码)定义并由实体框架生成的。

    【讨论】:

    • 嗯...多么糟糕的限制。 Code first 比 EDMX 模型简洁得多,遗憾的是他们没有在两者中实现这些功能。它们允许您指定自定义数据库初始化代码,因此即使牢记代码优先模型,包含它也是有意义的。叹息……
    • 终于,2 年后,有可能做到这一点:您可以从 Code First 访问 EDM。我添加了一个链接到 TVF 和 SP 映射的不完整实现的答案。
    【解决方案2】:

    从 EF 6.1 开始,现在可以映射函数,因为现在可以从 Code First 访问 EDM。

    这是一个允许映射 TVF 和存储过程的实现示例,但有一些限制。它还使用 EF 6 自定义约定。

    希望很快会有更完整的解决方案:

    https://codefirstfunctions.codeplex.com/

    注意:您可以使用 git 将代码复制到您的机器并修改/改进它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      相关资源
      最近更新 更多