2

我有一个现有的数据库,我正在使用 entityframework 6 Code-First 来使用它。不过,一个要求是所有使用数据库的工作都必须通过存储过程。所以我开始使用 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 对象来填充它,如果我有一种快速简单的方法来映射尊重 Column 属性的对象。

4

1 回答 1

3

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

于 2013-12-17T05:23:28.353 回答