Sql server 实体框架4.0函数导入将返回与直接运行存储过程不同的结果

Sql server 实体框架4.0函数导入将返回与直接运行存储过程不同的结果,sql-server,stored-procedures,entity-framework-4,Sql Server,Stored Procedures,Entity Framework 4,我有一个存储过程,用于计算给定日期段的预测销售数字 ALTER PROCEDURE [dbo].[CalculateMonthlyForecast] @CustomerID Int = -1, @ProductID Int = -1, @ForecastDate DateTime = NULL, @StartDate DateTime, @FinishDate DateTime AS BEGIN -- SET NOCOUNT ON added to

我有一个存储过程,用于计算给定日期段的预测销售数字

ALTER PROCEDURE [dbo].[CalculateMonthlyForecast]
    @CustomerID Int = -1,
    @ProductID Int = -1,
    @ForecastDate DateTime = NULL,
    @StartDate DateTime,
    @FinishDate DateTime
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Calculates each month's forecast as an individual row
    SELECT  [Year], [MonthNumber], [BaseSales], [ForecastSales]
    FROM    dbo.GetMonthlyForecast(@CustomerID, @ProductID, @StartDate, @FinishDate,     @ForecastDate)
END
它运行良好,并产生我期望的值。我已经在实体框架设计器中创建了一个函数导入,它应该将这些结果作为复杂类型MonthlyForecastResult的集合引入。我遇到的问题是MonthlyForecastResult对象中的值与存储过程生成的值不同

查看SQL Server Profiler中的跟踪,我可以看到实体框架在调用函数时生成的EXEC调用。直接在SQL Server中执行存储过程(使用生成的调用)将返回正确的结果,但函数返回的MonthlyForecastResult对象的值与存储过程结果的值不同

此外,BaseSales和ForecastSales值在MonthlyForecastResult对象中始终是相同的值,即使它们在存储过程的结果中非常不同

我能想到的唯一一件事可能是导致它与实体键混淆,但即使只有1行是返回,问题也会发生,我也不会想到实体键会在复杂类型的对象上发挥作用

更新

今天,我在更新应用程序的生产版本后发现,我遇到问题的行为似乎只发生在开发环境中。在连接到其数据库的客户机服务器上运行应用程序似乎产生了正确的数字(因为基本销售额和预测销售额之间存在差异)。这看起来很奇怪,因为我使用开发数据库中的精确定义更新了他们的数据库,并使用干净的设置重新安装了应用程序,从而更新了应用程序,所以它也应该是相同的

示例

如果我让它计算2012年9月的月度预测,EF生成的执行调用将在SQL Server Profiler中显示为:

exec [dbo].[CalculateMonthlyForecast] @CustomerID=1,@ProductID=2,@ForecastDate=NULL,@StartDate='2012-09-01',@FinishDate='2012-10-01'
如果我复制它并在SQL Server中运行它,我将返回三行:

Year Month BaseSales ForecastSales 2012 8 660 660 2012 9 3590 10890 2012 10 1652 1652 年-月销售预测销售 2012 8 660 660 2012 9 3590 10890 2012 10 1652 1652 注:额外月份是因为它是根据周计算的,9月份第一周的开始和最后一周的结束与其他月份重叠

根据我的手动计算,这是正确的,但MonthlyForecastResult对象没有这些值。生成的三个对象具有以下值:

Year Month BaseSales ForecastSales 2012 8 498 498 2012 9 9970 9970 2012 10 2717 2717 年-月销售预测销售 2012 8 498 498 2012 9 9970 9970 2012 10 2717 2717
有人知道是什么原因导致存储过程结果与复杂类型值不同吗?

是否确实返回的是复杂类型而不是实体类型?显示一些数据差异的示例。它肯定返回一个复杂类型。当我为存储过程创建函数导入时,我使用“创建新的复杂类型”命令创建了MonthlyForeCasterResult,该类显示在Visual Studio数据模型设计器的“复杂类型”文件夹中。运行SQL Server Profiler并获取调用此存储过程时EF发送到数据库的SQL。可能数据没有被发送,或者发送不正确。@Gromer-我不确定我是否完全理解。如果您是指实体框架调用存储过程时,示例中的执行调用直接取自SQL Server Profiler。呃,我完全误解了这一部分,请忽略我的注释。真奇怪!我最近经常在EF中使用存储过程,但没有遇到这些问题。