Dapper.Net ORMを使用して、ストアドプロシージャの出力を具体的な型にキャストするにはどうすればよいですか?

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

質問

Entity Frameworkの使用私が取り組んでいるプロジェクトのデータベースでは、ほとんどのsprocsから具体的なクラスを作成できます。しかし、sprocsの中には動的SQLを使用するものがあり、sprocのメタデータは返されません。

そのsprocのために、私は手動で具象クラスを作成し、今度はこのクラスにsproc出力をマップし、このタイプのリストを返したいと思います。

私はオブジェクトのコレクションを取得することができます次のメソッドを使用して:

                var results = connection.Query<object>("get_buddies", 
                    new {   RecsPerPage = 100,
                            RecCount = 0,
                            PageNumber = 0,
                            OrderBy = "LastestLogin",
                            ProfileID = profileID,
                            ASC = 1}, 
                        commandType: CommandType.StoredProcedure);

私の具体的なクラスには

[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はプロパティがnull可能かどうかを知る方法がありません。 null可能なプロパティの種類については、プロパティを選択し、Nullableプロパティをtrue設定することで、 これらを手動で構成する必要があり true


人気のある回答

あなたのSQLカラムはbigint (すなわち、 Int64long )ですが、.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は合法ですか? はい、理由を学ぶ