除非明確列為匿名類型,否則Dapper不會讀取對象屬性

c# dapper

由於某種原因,Dapper Query不會從類型對象的屬性中填充參數。

以下代碼拋出一個異常,說我必須聲明@Username,即使憑據包含屬性credentials.Username .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接口的一部分 - 可能無關緊要但留在這裡,以防它們因某些我不知道的原因而相關。)

一般承認的答案

我最好的猜測是Dapper只關注屬性,而不是字段。嘗試將您的課程更改為以下內容,看看它是否有效。

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

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



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因