将存储过程映射到EF中的复杂类型

时间:2013-03-28 13:13:50

标签: entity-framework stored-procedures

我有一个存储过程,它返回一个带有may连接的数据选择,当我将它映射到EF时,正在为该存储过程创建一个复杂的类型模型。我是否可以为具有存储过程返回的更多列的另一个模型类更改此复杂类型?或者它必须返回相同数量的列?

由于

例如,我有一个存储过程,它返回一组客户:

    CREATE PROCEDURE [dbo].[CustomersSelect]
AS

    SELECT [CustomerID]
          ,[CompanyName]
          ,[ContactName]
          ,[ContactTitle]
          ,[Address]
          ,[City]      
      FROM [Northwind].[dbo].[Customers]

我在EF中导入此存储过程而不是使用特定的复杂类型,我想将其映射到Customer类

public partial class Customer
    {
        public Customer()
        {
            this.Orders = new HashSet<Order>();
        }

        public string CustomerID { get; set; }
        public string CompanyName { get; set; }
        public string ContactName { get; set; }
        public string ContactTitle { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string Region { get; set; }
        public string PostalCode { get; set; }
        public string Country { get; set; }
        public string Phone { get; set; }
        public string Fax { get; set; }

        public virtual ICollection<Order> Orders { get; set; }
    }

在控制器中,我尝试使用此存储过程:

public ActionResult About()
{
       var model = context.CustomersSelect();
       return View(model);
}

当我运行此About()操作时,收到此错误:

  

数据阅读器与指定的'EfMvc4Model.Customer'不兼容。类型为“Region”的成员在数据读取器中没有相应的列具有相同的名称。

对此有何帮助?

谢谢

1 个答案:

答案 0 :(得分:0)

不幸的是,你无法做你想做的事。如果您有两个单独的存储过程,它们返回两个不同的数据集(即使一个是另一个的超集),您将需要使用两个单独的复杂类型来映射这些存储过程。

正如您所见:当您尝试“重复使用”第二个存储过程的复杂类型(返回较少的列)时,您将遇到如下错误:

  

System.Data.EntityCommandExecutionException未处理

     

数据读取器与指定的“xxxxxxx”不兼容。类型为“ABC”的成员在数据读取器中没有相应的具有相同名称的列   源= System.Data.Entity的

你的第二次电话永远不会奏效。我不知道如何解决这个问题 - 除了使用两个不同的,单独的复杂类型完全匹配存储过程的输出“形状”。