使用EF Extensions从SP构建相关实体

时间:2009-12-14 13:32:01

标签: entity-framework stored-procedures

我有一个存储过程,它返回我的实体类对象的集合。由于我希望我的导航属性也已填充,因此我使用EF Extensions并编写了自己的Materializer类。

但是。我的实体类具有Type的导航属性,指向不同的实体。存储过程当然会从查找表(外键)返回一个ID。

我想填充我的类型,好像我正急切地加载一个相关的实体。我如何在Materializer中执行此操作? 我是否可以在没有返回两个结果集的存储过程的情况下执行此操作?

我想实现类似于Include()扩展方法在LINQ语句中对源选择所做的事情。

1 个答案:

答案 0 :(得分:0)

前段时间我自己解决了这个问题。我只是在回答我自己的问题,如果有其他人需要的话。

那么存储过程应返回什么样的结果?这在很大程度上取决于关系类型。假设我们有两个表:TableOneTableTwo

1:0..1关系

在这种情况下,存储过程应该立即返回:

select t1.*, t2.*
from TableOne t1
    [left] join TableTwo t2
    on t2.key = t1.key

当它们是1:1时,您可以轻松省略left

1:很多关系

在这种情况下,编写返回更多结果的存储过程要容易得多。从一个旁边的人开始,以便在绑定多个边桌时准备好。

/* relation one */
select *
from TableOne
/* relation many */
select *
from TableTwo

但是如果您仍想返回单个结果集,则应检查每条记录是否已加载某个实体。有一个名为FindOrAttach()的方法可以帮助你。因此,每个结果都将返回两个实体,如果加载,则必须进行切换。如果不是,则实现......但如上所述:返回两个结果集要容易得多。

很多:很多关系

您还应编写存储过程以返回更多结果。在这种情况下,其中3个。

/* first table */
select *
from TableOne
/* second table */
select *
from TableTwo
/* relation *:* */
select *
from TableOne2Table2

像往常一样构建前两个表,然后为每个记录调用Attach,从而通过TableOne和TableTwo中的键加载结果。这也将填充实体集导航属性。

我回家,这会帮助别人,因为它帮助了我。