繁体   English   中英

如何使用Entity Framework加载存储过程的结果?

[英]How can I use Entity Framework to load the results of a stored procedure?

我有一个挑战。 我们有一个最初设计用于VB6的数据库,大多数功能都存储在存储过程中。 我无法对存储过程进行更改,因为旧的应用程序仍然需要工作一段时间,而且我没有自己的数据库副本,我甚至可以简单地修改它。

那么是否可以从EF执行存储过程并让它最好将结果写入POCO的数组/集合中?

我已经尝试了数据库第一种方法和导入,但EF说存储过程不返回任何列,因此无法创建复杂类型。 我发现有一些方法可以改变存储过程以使其工作,但我无法改变我正在使用的数据库。

另一个挑战是结果中列的名称是“日期最后更改”,换句话说是空格。 EF将如何映射这些? 它会变成DataLastChanged还是Data_last_changed? 有没有办法用我的POCO标记属性来说明它们是如何映射的?

我希望的是类似的东西

var resuls = efContext.ExecuteStoredProcedure<MyPOCOType>("spName",param1, param2, ...);

并且让EF最好将结果与类型相匹配。 这样的事情存在吗? 顺便提一下,我们使用的是EF4,但我相信我们可以使用EF4。

我想我已经为自己解决了部分问题。 以下代码片段可以满足我的需求。

using (DbContext context = new DbContext("DBConnectionStringNameFromAppConfig"))
            {

                SqlParameter[] parameters =
                      {
                                        new SqlParameter("@OwnerID", DBNull.Value),
                                        new SqlParameter("@ExternalColorID", colorOwner.ExternalColorID),
                                        new SqlParameter("@ProductionSiteID", DBNull.Value),
                                        new SqlParameter("@PanelstatusNr", DBNull.Value),
                                        new SqlParameter("@DateLastChecked", DBNull.Value),
                                        new SqlParameter("@rowcount", DBNull.Value),
                      };
                var colors = context.Database.SqlQuery<Models.ColorSelectEvaluation>("[dbo].[sp_Color_Select_Evaluation] @OwnerID, @ExternalColorID, @ProductionSiteID, @PanelstatusNr, @DateLastChecked, @rowcount", parameters).ToList();

            }

令人困惑的仍然是列的命名。 它们似乎主要起作用,但EF并未将结果列“需要评估”映射到我的对象上的属性NeedsEvaluation。

关于列名不匹配。 stackoverflow上的另一个问答很好地解决了这个问题。 为什么在从DbSet <T> .SqlQuery映射实体时忽略了我的DbModelBuilder配置?

总而言之,MS认为它会很棒,但它们不支持以这种方式映射名称。 唯一的解决方案是更改存储过程,这对我来说是没有选择的,因为它会破坏仍在使用它的遗留应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM