我正在使用 Entity Framework 4.1 RC 和代码第一种方法。 如何调用自定义SQL函数?
如果我使用 EdmFunction 属性,我应该指定什么命名空间?
[EdmFunction("Namespace", "GetAge")]
public static int GetAge(Person p)
{
throw new NotSupportedException(…);
}
当我尝试使用此类函数执行LINQ查询时,抛出以下异常:
类型上指定的方法'...' '...'无法翻译成LINQ 实体存储表达式。
答案 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