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

时间:2013-01-31 05:04:06

标签: c# sql-server entity-framework

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

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

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

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

我希望的是

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

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

2 个答案:

答案 0 :(得分:1)

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

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。

答案 1 :(得分:0)

关于列名不匹配。 stackoverflow上的另一个Q&amp; A很好地解决了这个问题。 Why is my DbModelBuilder configuration ignored when mapping Entity from DbSet<T>.SqlQuery?

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