在实体框架中使用存储过程,如何让实体填充其导航属性?

use*_*545 21 .net c# entity entity-framework

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

实体框架允许您定义生成实体的存储过程.但是,我的实体具有"导航属性",使用此方法时未填充这些属性.

有工作吗?

Ale*_*mes 19

存储过程不可组合.因此,无法使用Include()或其他方法调用您的SPROC并让EF自动在同一查询中填充关系.

所以说你有产品和类别

你有一个sproc来获得产品:

var products = context.GetProducts(someproductfilter);
Run Code Online (Sandbox Code Playgroud)

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

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

var categories = context.GetCategoriesForProducts(someproductfilter);
Run Code Online (Sandbox Code Playgroud)

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

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

另一种方法是使用EFExtensions.写这篇文章的人创造了编写sprocs的能力,可以一次加载更多数据.

希望这可以帮助

干杯亚历克斯


Jon*_*ith 5

在使用EF研究存储过程(SP)时,我发现了这个问题.我也看到像@KristianNissen和@Todilo这样的人问过EF6是否有更新.

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

唯一的方法是编写SP以专门加载导航属性.但是现在有一些关于使用SP的好的Microsoft文档 - 请参阅Query SPSP返回多个结果集.

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