使用代码优先的实体框架中的TVF(表值函数)

时间:2013-06-03 16:24:23

标签: .net sql-server entity-framework ef-code-first user-defined-functions

是否有人知道是否可以使用代码优先在实体框架中使用TVF?具体来说:

我知道当前代码优先不支持这种情况(并且它看起来不像EF6也允许它)。另一方面,更高版本的EF在数据库优先方案中支持TVF(这对我来说不是一个选项)。我想知道是否有人知道是否有某种方法来模拟数据库首先通过操纵模型或类似的东西来做什么?

进一步澄清;我知道可以使用SQL包含TVF,但我也需要TVF可以组合(即成为实体LINQ语句的一部分)。

3 个答案:

答案 0 :(得分:8)

现在可以了。我创建了一个自定义模型约定,允许在EF6.1中的CodeFirst中使用存储函数。该约定可在NuGet http://www.nuget.org/packages/EntityFramework.CodeFirstStoreFunctions上获得。以下是包含所有详细信息的博客帖子的链接:http://blog.3d-logic.com/2014/04/09/support-for-store-functions-tvfs-and-stored-procs-in-entity-framework-6-1/

答案 1 :(得分:1)

目前可能。它被推迟到EF6之后。最好的办法是在用户语音板上投票。功能建议标题为“Code First support for Table-Valued Functions”。我只投了3票。

答案 2 :(得分:-3)

您可以在实体框架5中使用Table-Valued Function。我认为link将解决您的问题:

要在Entity Framework中使用表值函数,您需要执行以下步骤:

1. 在解决方案资源管理器中右键单击项目名称,指向“添加”,然后单击“新建”。         项目

2。从左侧菜单中选择数据,然后选择ADO.NET实体数据模型         模板窗格。

3. 输入TVFModel.edmx作为文件名,然后点击添加。

4. 在“选择模型内容”对话框中,选择“从数据库生成”,然后选择“         单击“下一步”。

5. 单击“新建连接”         在“服务器名称”文本框中输入(localdb)\v11.0         输入School作为数据库名称         单击“确定”。

6. 在“选择数据库对象”对话框的“表”节点下,选择
        Person,StudentGrade和Course tables。

7。选择存储过程下的GetStudentGradesForCourse功能         和函数节点注意,从Visual Studio 2012开始,实体设计器为         允许您批量导入存储过程和函数。

8。点击完成。

9。实体设计师提供了用于编辑模型的设计图面         显示。您在“选择数据库对象”中选择的所有对象         对话框将添加到模型中。

10. 默认情况下,每个导入的存储过程或函数的结果形状将为
        自动成为实体模型中的新复杂类型。但是我们想要映射         Student {GetStudentGradesForCourse函数对StudentGrade实体的结果:         右键单击设计图面,然后选择“模型浏览器”         在Model Browser中,选择Function Imports,然后双击
        GetStudentGradesForCourse功能         在“编辑函数导入”对话框中,选择“实体”,然后选择“StudentGrade”

您可以使用以下代码在Application中使用Table-Value Function来检索数据:

using (var context = new SchoolEntities())
{
    var CourseID = 4022;
    var Grade = 3.5M;

    // Return all the best students in the Microeconomics class.
    var students = from s in context.GetStudentGradesForCourse(CourseID)
                            where s.Grade >= Grade
                            select new
                            {
                                s.Person,
                                s.Course.Title
                            };

    foreach (var result in students)
    {
        Console.WriteLine(
            "Couse: {0}, Student: {1} {2}",
            result.Title, 
            result.Person.FirstName, 
            result.Person.LastName);
    }
}