3

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

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

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

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

我希望是这样的

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

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

4

2 回答 2

2

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

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。

于 2013-01-31T08:10:42.153 回答
0

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

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

于 2013-01-31T08:57:56.723 回答