Dapper.Net ORM을 사용하면 어떻게 저장 프로 시저 출력을 구체적인 형식으로 변환 할 수 있습니까?

c#-4.0 dapper metadata sql-server-2008-r2 stored-procedures

문제

Entity Framework 사용 내가 작업중인 프로젝트의 데이터베이스에서 대부분의 sprocs로부터 구체적인 클래스를 만들 수 있습니다. 그러나 sprocs 중 일부는 동적 SQL을 사용하므로 sproc에 대해 메타 데이터가 반환되지 않습니다.

그래서 그 sproc, 나는 수동으로 구체적인 클래스를 만들었고 이제 sproc 출력을이 클래스에 매핑하고이 유형의 목록을 반환하려고합니다.

다음 메소드를 사용하여 객체 컬렉션을 얻을 수 있습니다.

[DataContractAttribute(IsReference=true)]
[Serializable()]
public partial class LoggedInMember : ComplexObject
{

   /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.Int16 RowID
    {
        get
        {
            return _RowID;
        }
        set
        {
            OnRowIDChanging(value);
            ReportPropertyChanging("RowID");
            _RowID = StructuralObject.SetValidValue(value);
            ReportPropertyChanged("RowID");
            OnRowIDChanged();
        }
    }
    private global::System.Int16 _RowID;
    partial void OnRowIDChanging(global::System.Int16 value);
    partial void OnRowIDChanged();

    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.String NickName
    {
        get
        {
            return _NickName;
        }
        set
        {
            OnNickNameChanging(value);
            ReportPropertyChanging("NickName");
            _NickName = StructuralObject.SetValidValue(value, false);
            ReportPropertyChanged("NickName");
            OnNickNameChanged();
        }
    }
    private global::System.String _NickName;
    partial void OnNickNameChanging(global::System.String value);
    partial void OnNickNameChanged();
    .
    .
    .

내 구체적인 클래스에 포함되어 있습니다.

[DataContractAttribute(IsReference=true)]
[Serializable()]
public partial class LoggedInMember : ComplexObject
{

   /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.Int16 RowID
    {
        get
        {
            return _RowID;
        }
        set
        {
            OnRowIDChanging(value);
            ReportPropertyChanging("RowID");
            _RowID = StructuralObject.SetValidValue(value);
            ReportPropertyChanged("RowID");
            OnRowIDChanged();
        }
    }
    private global::System.Int16 _RowID;
    partial void OnRowIDChanging(global::System.Int16 value);
    partial void OnRowIDChanged();

    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.String NickName
    {
        get
        {
            return _NickName;
        }
        set
        {
            OnNickNameChanging(value);
            ReportPropertyChanging("NickName");
            _NickName = StructuralObject.SetValidValue(value, false);
            ReportPropertyChanged("NickName");
            OnNickNameChanged();
        }
    }
    private global::System.String _NickName;
    partial void OnNickNameChanging(global::System.String value);
    partial void OnNickNameChanged();
    .
    .
    .

결과를 반복하고 LoggedInMember 객체에 출력 매개 변수를 추가 할 필요없이 어떻게 매핑하여 WCF 서비스를 통해 목록을 반환 할 수 있습니까?

var results = connection.Query<LoggedInMember>("sq_mobile_get_buddies_v35", ... 다음 오류가 발생합니다.

System.Data.DataException : 열 0 (RowID = 1 - Int64) 구문 분석 오류 ---> System.InvalidCastException : 지정한 캐스트가 유효하지 않습니다. Deserialize에서 ...

수락 된 답변

이에 대한 해결책은 EF로 sproc에서 파생 된 복잡한 객체를 만드는 것입니다.

    public ProfileDetailsByID_Result GetAllProfileDetailsByID(int profileID)
    {
        using (IDbConnection connection = OpenConnection("PrimaryDBConnectionString"))
        {
            try
            {
                var profile = connection.Query<ProfileDetailsByID_Result>("sproc_profile_get_by_id",
                    new { profileid = profileID },
                    commandType: CommandType.StoredProcedure).FirstOrDefault();

                return profile;
            }
            catch (Exception ex)
            {
                ErrorLogging.Instance.Fatal(ex);        // use singleton for logging
                return null;
            }
        }
    }

이 경우 ProfileDetailsByID_Result는 모델 다이어그램에서 마우스 오른쪽 단추를 클릭하고 Add / Complex Type ...을 선택하거나 RHS에서 Complex Types 트리를 사용하여 Entity Framework를 사용하여 수동으로 만든 개체입니다.

주의 사항

이 객체의 속성은 sproc에서 파생되므로 EF는 속성이 nullable인지 여부를 알 수 없습니다. nullable 속성 형식의 경우 속성을 선택하고 Nullable 속성을 true 설정하여 속성을 수동으로 구성해야 true .


인기 답변

추측에 귀하의 SQL 열 bigint (즉 Int64 일명 long )하지만. NET 형식 Int16 속성이 있습니다.

당신은 변환을 가지고 놀 수 있고 다음과 같은 것을함으로써 저장 프로 시저를 무시할 수 있습니다 :

var results = connection.Query<LoggedInMember>("select cast(9 as smallint) [RowID] ...");

객체를 반환하려는 속성 및 유형을 선택하는 곳입니다. ( smallintInt16 해당하는 SQL입니다.)




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.