有谁知道是否可以使用代码优先在实体框架中使用 TVF?再具体一点:
我知道目前不支持代码优先(而且看起来 EF6 也不会允许它)。另一方面,EF 的更高版本在数据库优先方案中支持 TVF(这对我来说不是一个选项)。我想知道是否有人知道是否有某种方法可以通过操纵模型或类似的东西来模拟数据库首先做什么?
进一步澄清;我知道它可以通过使用 SQL 来包含 TVF,但我还需要 TVF 是可组合的(即成为实体 LINQ 语句的一部分)。
有谁知道是否可以使用代码优先在实体框架中使用 TVF?再具体一点:
我知道目前不支持代码优先(而且看起来 EF6 也不会允许它)。另一方面,EF 的更高版本在数据库优先方案中支持 TVF(这对我来说不是一个选项)。我想知道是否有人知道是否有某种方法可以通过操纵模型或类似的东西来模拟数据库首先做什么?
进一步澄清;我知道它可以通过使用 SQL 来包含 TVF,但我还需要 TVF 是可组合的(即成为实体 LINQ 语句的一部分)。
现在这是可能的。我创建了一个自定义模型约定,它允许在 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-框架-6-1/
目前是不可能的。它被推迟到EF6之后。最好的办法是在他们的用户语音板上投票。该功能建议的标题为“表值函数的代码优先支持”。我只投了 3 票。
您可以Table-Valued Function
在 Entity Framework 5 中使用。我认为该链接将解决您的问题:
要在实体框架中使用表值函数,您需要执行以下步骤:
1. 在解决方案资源管理器中右键单击项目名称,指向添加,然后单击新建
项目。
2. 从左侧菜单中选择数据,然后在模板窗格中选择 ADO.NET 实体数据模型。
3. 输入TVFModel.edmx
文件名,然后单击添加。
4. 在选择模型内容对话框中,选择从数据库生成,然后单击下一步。
5. 单击 New Connection(localdb)\v11.0
在 Server name 文本框中输入 Enter School 作为数据库名称 单击 OK。
6. 在选择您的数据库对象对话框中,在表节点下,选择
人员、学生成绩和课程表。
7. 选择GetStudentGradesForCourse
存储过程和函数节点下的函数 注意,从 Visual Studio 2012 开始,实体设计器
允许您批量导入存储过程和函数。
8. 单击完成。
9. 显示实体设计器,它提供用于编辑模型的设计表面
。您在选择您的数据库对象
对话框中选择的所有对象都将添加到模型中。
10.默认情况下,每个导入的存储过程或函数的结果形状都会
自动成为您实体模型中的新复杂类型。但是我们要将GetStudentGradesForCourse
函数的结果映射到StudentGrade实体:右击设计图面并选择Model Browser 在Model Browser中,选择Function Imports,然后双击
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);
}
}