テンプレートオブジェクトからDynamicParamters
を作成すると、出力パラメータをDapperを使用してオブジェクトに正しくマッピングする方法に苦労しています。
var parameters = new DynamicParameters(entity);
parameters.Add("@Id", dbType: DbType.Int32, direction: ParameterDirection.Output);
parameters.Output(entity, x => x.Id);
await conn.ExecuteAsync(
"TodoItemInsert", entity,
commandType: CommandType.StoredProcedure);
私の希望は、上記のコードは結果のIDを、最初にパラメータを作成したエンティティにマップすることでした。何を試しても、ストアドプロシージャから返されるパラメータを取得できません。 parameters.Get<int>("@Id")
をKeyNotFoundException
、 KeyNotFoundException
スローされます。 parameters.Get<int?>("@Id")
はnullを返します。
私のSQLは非常に基本的な挿入sprocです
ALTER PROCEDURE [dbo].[TodoItemInsert]
@Name VARCHAR(255)
, @Description VARCHAR(512)
, @DueDate DATETIME = NULL
, @IsComplete BIT = 0
, @Id INT OUTPUT
AS
INSERT INTO
[TodoItems]
(
Name
, Description
, DueDate
, IsComplete
)
VALUES
(
@Name
, @Description
, @DueDate
, @IsComplete
)
SET @Id = SCOPE_IDENTITY()
DynamicParameters
オブジェクトテンプレートを使用しようとしたときにDapperから出力パラメータを返す正しい方法は何ですか?
これを見て、私がテンプレートからパラメータに移動したときに私のコードを正しく更新しなかった。私はentity
をparameters
ではなくクエリに渡していました。私がそれを置き換えると、 Id
出力パラメータの明示的な追加を取り除くことさえできる。これははるかにいいです!
var parameters = new DynamicParameters(entity);
parameters.Output(entity, x => x.Id);
await conn.ExecuteAsync(
"TodoItemInsert", parameters,
commandType: CommandType.StoredProcedure);