0

我有一个存储过程,它返回带有可能连接的数据选择,当我将它映射到 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”不兼容。类型的成员“区域”在数据读取器中没有同名的对应列。

对此有什么帮助吗?

谢谢

4

1 回答 1

0

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

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

System.Data.EntityCommandExecutionException 未处理

数据读取器与指定的“xxxxxxx”不兼容。类型的成员“ABC”在数据读取器中没有同名的对应列。
源=系统.数据.实体

你的第二个电话永远不会奏效。我看不出你怎么能解决这个问题——除了使用两个完全匹配存储过程的输出“形状”的不同的、独立的复杂类型。

于 2013-03-28T21:33:02.903 回答