DynamicParameters.Output <t>不会将输出映射到模型

时间:2016-10-06 19:19:45

标签: dapper

我使用Dapper执行一个返回两个输出参数的存储过程。一次是xml数据类型,另一个是整数。我尝试在Output<T>类型上使用DynamicParameters方法。但是,当我使用它时,分配的值始终为default(T),因此在此示例中TotalNoOfUsers为0。

这是我工作的示例模型。

public class Foo
{
    public string Xml { get; set; }

    public int NumberOfUsers { get; set; }
}

以下是我为了证明行为而编写的单元测试。

[TestMethod]
public async Task Test()
{
    var foo = new Foo();
    var connection = new SqlConnection(this.connectionString);
    await connection.OpenAsync();

    var parameters = new DynamicParameters();
    parameters.Add("ApplicationInstanceRoleId", this.roleId);
    parameters.Add("TotalNoOfUsers", 0, DbType.Int32, ParameterDirection.Output);
    parameters.Output(foo, output => output.NumberOfUsers);

    await connection.ExecuteAsync(
        "USP_Get_UsersAndAccessControlXML4ApplicationRole",
        parameters,
        commandType: CommandType.StoredProcedure);

   Assert.AreNotEqual(0, foo.NumberOfUsers);
}

但是我可以使用Get<T>方法,它会返回预期的输出。

[TestMethod]
public async Task Test()
{
    var foo = new Foo();
    var connection = new SqlConnection(this.connectionString);
    await connection.OpenAsync();

    var parameters = new DynamicParameters();
    parameters.Add("ApplicationInstanceRoleId", this.roleId);
    parameters.Add("TotalNoOfUsers", 0, DbType.Int32, ParameterDirection.Output);

    await connection.ExecuteAsync(
        "USP_Get_UsersAndAccessControlXML4ApplicationRole",
        parameters,
        commandType: CommandType.StoredProcedure);

    foo.NumberOfUsers = parameters.Get<int>("TotalNoOfUsers");
    Assert.AreNotEqual(0, foo.NumberOfUsers);
}

我是否错误地使用了Output<T>

1 个答案:

答案 0 :(得分:1)

查看以下Dapper issue,同时修复已合并here。 同时检查Marc对另一个查询here

的回复

简单的一点是在上面粘贴的代码中,它不起作用,是在创建DynamicParameter以通过表达式映射Output时,需要一个映射的对象模板,它需要以下构造函数被叫,不是默认的:

public DynamicParameters(object template);

发布您当然需要告诉ParameterDirection已经在代码中完成,否则它会默认将所有内容都视为InputParameter,但仍然会导致错误。

由于您没有传递模板,这就是输出无法映射到正确值的原因,输出结果为0