除非明确列为匿名类型,否则Dapper不会读取对象属性

时间:2014-11-14 19:48:32

标签: c# dapper

Dapper Query不会从类型对象填充参数'属性出于某种原因。

以下代码抛出一个异常,说我必须声明@Username,即使凭据包含属性credentials.Username

const string qryCheckCredentials = "SELECT 1 AS Authenticated FROM dbo.KIUser WHERE Username=@Username AND Password=@PasswordMD5";
if (!sqlConn.Query<Boolean>(qryCheckCredentials, param: credentials).FirstOrDefault<Boolean>())
    throw new UnauthorizedAccessException..

但是,如果我明确地将凭证属性列入匿名对象,它可以正常工作:

const string qryCheckCredentials = "SELECT 1 AS Authenticated FROM dbo.KIUser WHERE Username=@Username AND Password=@PasswordMD5";
if (!sqlConn.Query<Boolean>(qryCheckCredentials, param: new { Username = credentials.Username, PasswordMD5 = credentials.PasswordMD5 } ).FirstOrDefault<Boolean>())
    throw new UnauthorizedAccessException..

任何想法为什么?我在我的代码中遇到了这个问题,无法查看模式或弄清楚我错过的内容。

凭据类型:

[DataContract]
public class Credentials
{
    [DataMember]
    public string Username;
    [DataMember]
    public string PasswordMD5;
}

发生了许多类型,并通过它们列出明确解决了问题。

(DataContract / DataMember属性修饰是因为该对象是WDSL界面的一部分 - 可能无关紧要但留在这里,以防他们因某些原因而非相关的原因。)

1 个答案:

答案 0 :(得分:3)

我最好的猜测是Dapper只关注属性,而不是字段。尝试将您的课程更改为以下内容,看看它是否有效。

[DataContract]
public class Credentials
{
    [DataMember]
    public string Username {get; set;}
    [DataMember]
    public string PasswordMD5 {get; set;}
}

无论如何,使用公共财产通常被认为是更好的做法。