Dapper는 익명 형식으로 명시 적으로 나열되어 있지 않으면 개체 속성을 읽지 않습니다.

c# dapper

문제

Dapper Query는 어떤 이유로 입력 된 객체의 속성에서 매개 변수를 채우지 않습니다.

다음 코드는 자격 증명에 property credentials.Username 포함되어 있어도 @Username을 선언해야한다는 예외를 throw합니다.

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는 합법적입니까? 예, 이유를 알아보십시오.