使用Code-First在Entity Framework中实现TVF(表值函数)

11

有人知道在使用Code First的实体框架中是否可以使用TVFs吗?具体来说:

目前Code First不支持此功能(而且EF6似乎也不会支持)。另一方面,EF的较新版本支持在数据库优先场景下使用TVFs(这对我来说不是一个选项)。我想知道是否有人知道是否有一些方法通过操纵模型或类似的方式来模拟数据库优先所做的事情?

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


在EF6中,一个非常hacky的解决方法是使用拦截器将实体的表名重写为TVF调用。我已经在这里做了一个示例实现不建议使用! - sinelaw
这现在可以通过EF6.1和我创建的自定义约定实现。请查看下面我的回答。 - Pawel
3个回答

8

太棒了,Pawel!我今天早些时候读了你的博客。下次我们尝试摆脱edmx文件时,我很期待尝试它。 - Cameron Taggart

1

目前还不可能。这个功能已经推迟到EF6之后了。最好的方法是在用户反馈板上为它投票。该功能建议的标题是“Code First support for Table-Valued Functions”。我刚刚为它投了3票。


现在可以了 - 请看我的回答。 - Pawel

-3

您可以在Entity Framework 5中使用表值函数。我认为链接会解决您的问题:

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

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

2. 在左侧菜单中选择“数据”,然后在模板窗格中选择“ADO.NET Entity Data Model”。

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

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

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

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

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

8. 单击“完成”。

9. 显示实体设计器,提供一个设计界面来编辑您的模型。在“选择数据库对象”对话框中选择的所有对象都将添加到模型中。

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

您可以使用以下代码在应用程序中使用表值函数检索数据:

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);
    }
}

Vaibhav,他正在询问“代码优先支持”。一个.edmx文件是“数据库优先”。 - Cameron Taggart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接