如何使用实体框架加载存储过程的结果

本文关键字:存储过程 结果 加载 框架 何使用 实体 | 更新日期: 2023-09-27 17:56:51

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

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

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

另一个挑战是结果中列的名称类似于"上次更改日期",换句话说,带有空格。EF 将如何尝试映射这些内容?它会变成 DataLastChanged 还是可能Data_last_changed?有没有办法用属性标记我的 POCO 以说明它们的映射方式?

我希望的是类似的东西

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

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

如何使用实体框架加载存储过程的结果

我想

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

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 映射实体时忽略了我的 DbModelBuilder 配置。SqlQuery?

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