如何在EF Code First中填充包含来自存储过程的子集合的模型

时间:2011-08-18 06:36:30

标签: stored-procedures entity-framework-4 ef-code-first

我有一个项目首先使用实体​​框架代码。

由于各种原因,其中一个linq查询执行得不好,我想用存储过程调用替换它。

以下代码适用于调用存储过程并将结果转换为List。

IEnumerable<Activity> activities =
    ((IObjectContextAdapter)MyContext)
       .ObjectContext.ExecuteStoreQuery<Activity>("GetActivities").ToList();

但是我还想在活动模型上添加一些包含该对象的子集合之一。例如,Activity具有虚拟列表集合。我可以在存储过程中为每个活动返回标记。

如果我这样做,则无效

SELECT
   Activities.ID,
   Activities.Name,
   Tags.ID,
   Tags.Name
FROM
   Activities
   LEFT JOIN ActivityTags ON ActivityTags.ActivityID = Activities.ID
   LEFT JOIN Tags ON Tags.ID = ActivityTags.TagID

C#中的错误表明它不是有效的活动。如果我从存储过程中删除了Tags位,那么它只是从Activities表中选择它可以正常工作。

我不确定使用实体框架的存储过程是否可以提出我的要求。如果不是,我可能不得不求助于使用SqlCommand并从我的结果集中构建模型。

1 个答案:

答案 0 :(得分:2)

这是不可能的。自动实体填充仅适用于扁平对象=您可以填充Activity但不能填充其关系。如果要加载关系,则必须使用标准ADO.NET,但在这种情况下,最好修改存储过程以返回每个表的单独结果集,以减少传输的数据量。