2

Entity Frameworkを使用すると、作業中のプロジェクトのデータベースにあるほとんどのsprocから具象クラスを作成できます。ただし、一部のsprocは動的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:指定されたキャストが無効です。デシリアライズで...

4

2 に答える 2

1

推測では、SQL列はbigint(つまりInt64別名long)ですが、.NetタイプにはInt16プロパティがあります。

次のような操作を行うことで、変換を試して、ストアドプロシージャを無視することができます。

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

オブジェクトを返したいプロパティとタイプを選択するだけです。(smallintSQLと同等のInt16

于 2012-06-05T21:23:19.720 に答える
0

The solution to this was to create a complex object derived from the sproc with EF:

    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;
            }
        }
    }

In this case, ProfileDetailsByID_Result is the object that I manually created using Entity Framework through the Complex Type creation process (right-click on the model diagram, select Add/Complex Type..., or use the Complex Types tree on the RHS).

A WORD OF CAUTION

Because this object's properties are derived from the sproc, EF has no way of knowing if a property is nullable. For any nullable property types, you must manually configure these by selecting the property and setting its it's Nullable property to true.

于 2012-06-06T14:07:19.380 に答える