在实体框架中使用存储过程(代码优先)

Posted

技术标签:

【中文标题】在实体框架中使用存储过程(代码优先)【英文标题】:Use stored procedure in Entity Framework (code first) 【发布时间】:2012-01-10 17:27:28 【问题描述】:

我使用这段代码来定义我的存储过程

CREATE PROCEDURE [dbo].[SP]
(@Country NVARCHAR(20))
AS
BEGIN
    SET NOCOUNT ON;
    SELECT c.*,O.* from Customers
           as c inner join orders O on c.CustomerID=o.CustomerID

     where  c.Country=@Country 
END

这是我的 C# 代码:

IList<Entities.Customer> Customers;

using (var context = new NorthwindContext())

   SqlParameter categoryParam = new SqlParameter("@Country", "London");
   Customers = context.Database.SqlQuery<Entities.Customer>("SP @Country",  categoryParam).ToList();

问题来了:

我想将Orders 表中的数据发送给我,我的存储过程会生成这个给我。如何在我的 C# 代码中获取 Orders 数据?记住我只想执行一次这个存储过程。

【问题讨论】:

【参考方案1】:

看看Does Entity Framework Code First support stored procedures? 和http://blogs.msdn.com/b/wriju/archive/2011/05/14/code-first-4-1-using-stored-procedure-to-insert-data.aspx,它们讨论了通过 DbContext 对象执行存储过程。

我认为您的问题可能是您没有将订单作为查询的一部分取回?它是否正确?如果是这样,这是因为您只选择客户。您需要创建一个与您期望从查询返回的架构相同的对象(即同时具有客户和订单属性)或选择动态类型 (eww)。

话虽如此,我强烈建议在 linq 中执行此操作:

from c in context.Customers.Include(c=>c.Orders)
where c.Country == country
select c;

这是一种更好的方法,因为您将 EF 用于其设计用途,而不是查询不适合您的模型的东西

【讨论】:

tnkx 给你很好的和完整的答案。但是现在,我如何从我的 Store 过程中选择带有 linq 的动态类型。 我不是 100% 确定,但类似 ​​var customers = context.Database.SqlQuery("SP @Country", categoryParam).ToList();可能是正确的 tnkx 我会试试你的解决方案

以上是关于在实体框架中使用存储过程(代码优先)的主要内容,如果未能解决你的问题,请参考以下文章

如何从实体框架中的存储过程中获取结果+数据库优先

在实体框架数据库优先方法中,如何从存储过程返回多个结果集?

使用实体框架核心生成和访问存储过程

具有实体框架问题的 Informix 存储过程

在实体框架中使用存储过程

实体框架代码优先 - 为 SqlQuery 配置映射