2011-04-02 99 views
8

我使用的是实体框架4.1 RC和代码优先的方法。 如何调用自定义SQL函数?自定义SQL函数和代码优先(EF 4.1)

如果我使用EdmFunction属性,我应该指定哪个名称空间?

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

当我尝试执行与这样的功能LINQ查询以下异常被抛出:

指定的方法“...”的类型 “...”不能被翻译进入LINQ到 实体存储表达式。

回答

8

如果要调用SQL函数,则必须执行自定义SQL查询。要做到这一点使用context.Database.SqlQuery。实体框架支持存储过程映射,但此功能在DbContext API(EF 4.1)中不受支持。如果你想调用一个存储过程,你必须再次使用context.Database.SqlQuery。存储过程不能在Linq查询中使用。

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

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

+11

嗯......多么糟糕的限制。代码首先比EDMX模型清洁得多,但他们没有在这两个模块中实现这些功能是一种遗憾。他们让你指定自定义数据库初始化代码,所以即使将代码放在第一个模型的头脑中,包含它也是有意义的。叹息... – Ocelot20 2012-06-29 19:22:42

+0

最后,2年后,可以这样做:您可以使用Code First的EDM。我添加了一个链接到一个不完整的TVF和SP映射实现的答案。 – JotaBe 2014-06-11 15:41:37

3

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

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

但愿会有很快更完整的解决方案:

https://codefirstfunctions.codeplex.com/

注:还可以使用Git将代码复制到你的机器和修改/改进

1

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

+0

这很好用 – 2016-07-26 16:14:36

+0

您可以扩展您的答案以添加元数据如何工作的详细信息吗? – 2016-07-26 19:31:27