有人知道在使用Code First的实体框架中是否可以使用TVFs吗?具体来说:
目前Code First不支持此功能(而且EF6似乎也不会支持)。另一方面,EF的较新版本支持在数据库优先场景下使用TVFs(这对我来说不是一个选项)。我想知道是否有人知道是否有一些方法通过操纵模型或类似的方式来模拟数据库优先所做的事情?
进一步澄清一下;我知道可以使用SQL来包含TVFs,但我还需要这些TVFs是可组合的(即成为实体LINQ语句的一部分)。
有人知道在使用Code First的实体框架中是否可以使用TVFs吗?具体来说:
目前Code First不支持此功能(而且EF6似乎也不会支持)。另一方面,EF的较新版本支持在数据库优先场景下使用TVFs(这对我来说不是一个选项)。我想知道是否有人知道是否有一些方法通过操纵模型或类似的方式来模拟数据库优先所做的事情?
进一步澄清一下;我知道可以使用SQL来包含TVFs,但我还需要这些TVFs是可组合的(即成为实体LINQ语句的一部分)。
目前还不可能。这个功能已经推迟到EF6之后了。最好的方法是在用户反馈板上为它投票。该功能建议的标题是“Code First support for Table-Valued Functions”。我刚刚为它投了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);
}
}