使用Entity Framework Code First中的列名属性从存储过程进行对象映射

时间:2013-12-16 14:09:19

标签: ef-code-first entity-framework-6 columnattribute

我有一个现有的数据库,我正在使用entityframework 6 Code-First。但要求是所有与db的工作都必须通过存储过程。所以我开始使用6.0中的新映射:

modelBuilder.Entity<Post>().MapToStoredProcedures();

问题是这只支持映射插入,更新和删除sp而不是选择sp,我需要能够使用sp来选择。 (我无权编辑任何现有的sp)

我的poco有关于它们的属性,使用column属性指定要使用的列名。显然,虽然内置映射不支持使用它们,除非您通过dbset对象在表上进行直接选择。

最初我曾经(有效):

return (from c in DataContext.Current.AgeRanges orderby c.StartAge select c);

然后将其切换到我尝试的sp(使用数据库sqlquery调用):

return DataContext.Current.Database.SqlQuery<AgeRange>("[DIV].[GetAgeRangesList]").AsQueryable();

这返回了有效对象,但没有标记为Column属性的列中包含任何内容。

然后我尝试了(因为它反对实际的dbset对象我得到了列映射):

return DataContext.Current.AgeRanges.SqlQuery("[DIV].[GetAgeRangesList]").ToList().AsQueryable();

不,这反而给了我一个错误,即在返回的记录集中找不到POCO对象中的一个属性(其中一个Column属性)。

所以问题是,在实体框架(或者除此之外的最佳解决方案)中,调用存储过程并将结果映射到对象并使该映射尊重属性上的列属性的最佳方法是什么?

如果我有一种快速简便的方法来映射尊重列属性的对象,我甚至愿意使用旧的学校Table对象和SqlCommand对象来填充它。

1 个答案:

答案 0 :(得分:3)

SqlQuery不支持Column属性。如果返回结果集的列名称与实体属性的名称匹配,则应相应地设置属性。但请注意,SqlQuery只执行最少量的工作(例如,它不支持关系(.Include)),因此如果您决定使用存储过程进行查询,则限制自己。 这里正在跟踪增强SqlQuery以使用ColumnName属性:https://entityframework.codeplex.com/workitem/233 - 随意对此codeplex项进行upvote。