特定の期間の予測売上高を計算するストアド プロシージャがあります。
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
それはうまく動作し、私が期待する値を生成します。Entity Framework デザイナーで、これらの結果を複合型 MonthlyForecastResult のコレクションとして取得する関数インポートを作成しました。私が抱えている問題は、MonthlyForecastResult オブジェクトの値が、ストアド プロシージャによって生成された値と同じではないことです。
SQL Server プロファイラーでトレースを見ると、関数が呼び出されたときにエンティティ フレームワークによって生成された EXEC 呼び出しが表示されます。SQL Server で (生成された呼び出しを使用して) ストアド プロシージャを直接実行すると、正しい結果が返されますが、関数によって返される MonthlyForecastResult オブジェクトには、ストアド プロシージャの結果と同じ値がありません。
さらに、BaseSales と ForecastSales の値は、たとえストアド プロシージャの結果が大きく異なっていても、MonthlyForecastResult オブジェクトでは常に同じ値です。
それが原因であると考えられる唯一のことは、エンティティキーとの混同である可能性がありますが、1行だけが返される場合でも問題が発生し、複合型でエンティティキーが機能するとは思わなかったでしょうとにかくオブジェクト。
アップデート
アプリケーションの製品バージョンを更新した後、問題が発生している動作が開発環境でのみ発生するように見えることを今日発見しました。データベースに接続されたクライアントのサーバーでアプリケーションを実行すると、正しい数値が生成されているようです (基本売上と予測売上の間に予想される差異があるという点で)。開発データベースの正確な定義を使用してデータベースを更新し、クリーンセットアップを使用して再インストールしてアプリケーションを更新したため、これも奇妙に思えます。同じはずです。
例
2012 年 9 月の月間予測を計算するように依頼すると、EF によって生成された実行呼び出しが SQL Server プロファイラーに次のように表示されます。
exec [dbo].[CalculateMonthlyForecast] @CustomerID=1,@ProductID=2,@ForecastDate=NULL,@StartDate='2012-09-01',@FinishDate='2012-10-01'
それをコピーして SQL Server で実行すると、次の 3 つの行が返されます。
年 月 BaseSales ForecastSales 2012 8 660 660 2012 9 3590 10890 2012 10 1652 1652
注: 余分な月は、週に基づいて計算され、9 月の第 1 週の開始と最終週の終了が他の月と重なるためです。
これは私の手動計算によると正しいですが、MonthlyForecastResult オブジェクトにはこれらの値がありません。生成された 3 つのオブジェクトには、代わりに次の値があります。
年 月 BaseSales ForecastSales 2012 8 498 498 2012 9 9970 9970 2012 10 2717 2717
ストアド プロシージャの結果が複合型の値と異なる原因を特定できる人はいますか?