3

エンティティフレームワーク4.1(mvc 3 Webアプリケーション)からストアドプロシージャを呼び出そうとしました。例外はスローされませんが、挿入/更新は行われませんか?ストアドプロシージャを手動で実行すると、機能します。

CREATE PROCEDURE [dbo].[SP_AddUpdateResponse]
    @QuestionID int,
    @UserID int,
    @AnswerValue nvarchar(2000),
    @ReviewID int
AS

MERGE [dbo].[Responses] AS [Target]
USING (SELECT @QuestionID, @UserID, @AnswerValue, @ReviewID)
   AS [Source] ([QuestionID], [UserID], [AnswerValue], [ReviewID] )
ON [Target].[QuestionID] = [Source].[QuestionID]
AND [Target].[ReviewID] = [Source].[ReviewID]

WHEN MATCHED THEN
    UPDATE SET [AnswerValue] = [Source].[AnswerValue]
WHEN NOT MATCHED THEN
    INSERT ( [QuestionID], [UserID], [AnswerValue], [ReviewID] )
    VALUES ( [Source].[QuestionID], [Source].[UserID], 
             [Source].[AnswerValue], [Source].[ReviewID] );

プロシージャを呼び出すコード:

using System.Data.SqlClient;
using System.Data.Metadata.Edm;

using (var db = new NexGenContext())
            {
                foreach (var key in formCollection.AllKeys)
                {
                    var answer = formCollection[key];
                    int questionId = Convert.ToInt32(key);
                    db.Database.SqlQuery<EntityType>(
                        "EXEC SP_AddUpdateResponse @QuestionID, @UserID, @AnswerValue, @ReviewID",
                        new SqlParameter("@QuestionID", questionId),
                        new SqlParameter("@UserID", 9999),
                        new SqlParameter("@AnswerValue", answer),
                        new SqlParameter("@ReviewID", id)
                    );                         
                }
            }
4

1 に答える 1

8

ExecuteSqlCommand 代わりに使用してみてくださいSqlQuery

db.Database.ExecuteSqlCommand(
                            "EXEC SP_AddUpdateResponse @QuestionID, @UserID, @AnswerValue, @ReviewID",
                            new SqlParameter("@QuestionID", questionId),
                            new SqlParameter("@UserID", 9999),
                            new SqlParameter("@AnswerValue", answer),
                            new SqlParameter("@ReviewID", id)
                        );

メソッドの説明では、SqlQuery「メソッドを使用して、コンテキストによって追跡されるエンティティを返す」と述べているため、SELECTクエリにのみ使用できます。

于 2012-12-20T23:03:09.950 に答える