【问题标题】:TVF (Table Value Function) in entity framework using code-first实体框架中使用代码优先的 TVF(表值函数)
【发布时间】:2013-05-29 21:05:02
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

这现在是可能的。我创建了一个自定义模型约定,它允许在 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/

【讨论】:

  • 帕维尔的工作很棒!我今天早些时候读了你的博客。我期待下次我们尝试放弃 edmx 文件时尝试一下。
【解决方案2】:

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

【讨论】:

  • 现在有可能 - 请参阅我的回答。
【解决方案3】:

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

要在实体框架中使用表值函数,您需要执行以下步骤:

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

2. 从左侧菜单中选择数据,然后在 模板窗格。

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

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

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

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

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

8.点击完成。

9. 提供用于编辑模型的设计界面的实体设计器是
显示。您在选择您的数据库对象
中选择的所有对象 对话框被添加到模型中。

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

您可以使用以下代码在应用程序中使用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);
    }
}

【讨论】:

  • Vaibhav,他在询问“代码优先支持”。 .edmx 文件是“数据库优先”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 2017-07-05
  • 1970-01-01
  • 2017-09-01
相关资源
最近更新 更多