在实体框架中使用存储过程,如何让实体填充其导航属性?
-
10-07-2019 - |
题
实体框架速度非常慢,所以我尝试使用存储过程,但我遇到了这个问题。
实体框架允许您定义生成实体的存储过程。但是,我的实体具有“导航属性”,使用此方法时未填充这些属性。
有解决方法吗?
解决方案
存储过程不可组合。因此,无法调用您的SPROC并让EF使用Include()或其他内容在同一查询中自动填充关系。
所以说你有产品和类别
你有一个sproc来获得产品:
即
var products = context.GetProducts(someproductfilter);
生成的产品不会加载其类别。
但是,如果您有第二个存储过程来获取所述产品的类别:
即
var categories = context.GetCategoriesForProducts(someproductfilter);
EF中称为关系修正的功能,在第二个实体进入上下文后链接相关实体,将确保在两次调用完成后,产品中的每个产品都将具有非空类别。
这不太理想,因为您正在执行多个查询,但它可以正常工作。
另一种方法是使用 EFExtensions 。写这篇文章的人创造了编写sprocs的能力,可以一次加载更多数据。
希望这有帮助
干杯 亚历
其他提示
我在使用EF研究存储过程(SP)时发现了这个问题。我也看到像@KristianNissen和@Todilo这样的人问过EF6是否有更新。
答案是肯定的,EF 6改变了一些东西,但它没有添加任何东西来帮助在使用SP时加载导航属性。您也不能使用.sclude()方法和SP一起使用问题。
唯一的方法是编写SP以专门加载导航属性。但是,现在有一些关于使用SP的Microsoft文档很好 - 请参阅查询SP 和
不隶属于 StackOverflow