24

实体框架非常慢,所以我尝试使用存储过程,但遇到了这个问题。

Entity Framework 允许您定义生成实体的存储过程。但是,我的实体具有使用此方法时未填充的“导航属性”。

有解决办法吗?

4

2 回答 2

20

存储良好的过程是不可组合的。所以没有办法调用你的 SPROC 并让 EF 在同一个查询中自动填充关系,使用 Include() 或其他东西。

所以说你有产品和类别

并且您有一个存储过程来获取产品:

IE

var products = context.GetProducts(someproductfilter);

生成的产品不会加载其类别。

但是,如果您有第二个存储过程来获取所述产品的类别:

IE

var categories = context.GetCategoriesForProducts(someproductfilter);

EF 中称为关系修复的功能,一旦第二个实体进入上下文就链接相关实体,将确保在进行两次调用后,产品中的每个产品都将具有非空类别。

这并不理想,因为您正在执行多个查询,但它会起作用。

另一种方法是使用EFExtensions。编写该代码的人创造了编写存储过程的能力,这些存储过程可以一次性加载更多数据。

希望这可以帮助

干杯亚历克斯

于 2009-06-24T00:13:14.123 回答
5

我在使用 EF 研究存储过程 (SP) 时发现了这个 SO 问题。我还看到 @KristianNissen 和 @Todilo 等人询问是否有 EF6 的更新。

答案是肯定的,EF 6 改变了一些东西,但它没有添加任何东西来帮助在使用 SP 时加载导航属性。你也不能像这个SO question中所问的那样对 SP 使用 .Include() 方法。

唯一的方法是编写您的 SP 来专门加载导航属性。然而,现在有一些关于使用 SP 的很好的 Microsoft 文档 - 请参阅查询 SPSP 返回多个结果集

为了完整起见,EF 版本 6 带来的更改是允许存储过程 (SP) 处理插入、更新和删除 - 请参阅Microsoft 文章实体框架教程

于 2015-10-17T10:49:53.023 回答