自定义SQL函数和Code First(EF 4.1)

时间:2011-04-02 22:52:52

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

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

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

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

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

  

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

3 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:3)

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

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

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

https://codefirstfunctions.codeplex.com/

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

答案 2 :(得分:1)

我成功了,看到这个项目https://github.com/divega/UdfCodeFirstSample