2014-11-14 216 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;} 
} 

無論如何,使用公共屬性通常被認爲是更好的做法。