2014-11-14 218 views
2

由于某种原因,Dapper查询未从类型对象的属性中填充参数。Dapper不会读取对象属性,除非明确列出为匿名类型

下面的代码会抛出一个异常说我必须声明@username,即使证书包含属性credentials.Username

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

但是如果我列出的凭证属性明确纳入一个匿名对象,它工作正常:

const string qryCheckCredentials = "SELECT 1 AS Authenticated FROM dbo.KIUser WHERE [email protected] AND [email protected]"; 
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 /数据成员属性的装饰品是因为对象是WDSL接口的一部分 - 可能无关紧要,但离开这里,如果他们是有关出于某种原因超出了我的知识)

+2

也许Dapper只适用于属性,而你有公共领域。 – juharr 2014-11-14 19:53:25

+0

这正是问题谢谢@ juharr7。对我懒惰的编程感到羞耻,并且非常感谢。 '公共字符串用户名{get;设置;}'解决了这个问题,删除它们又把它带回来。只是没有看到它。 – Chris 2014-11-14 20:02:14

+1

有关信息,这已经记录下来,我打算修复它,因为* results *对于字段和属性都适用,但*参数*仅适用于属性,这是不一致的。我试图在几个星期前破解它,但它在我的脸上以不好的方式爆炸 - 我需要坐下来再试一次:( – 2014-11-15 10:10:35

回答

2

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

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

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