3

私は次のようなクラスを持っています:

public class Analyst
{
    [Column("Internal_ID")]
    public int ID { get; set; } // if this is named like the column, it works
    [Column("DisplayName")]
    public string Name { get; set; }
}

このオブジェクトはそのように埋められています(この次の部分はDbContextから継承するクラスにあります):

public List<T> ExecProc<T>(string proc, Dictionary<string, object> params)
{
        var parms = new List<SqlParameter>();
        var sql = new StringBuilder();
        sql.Append(sproc.StoredProcedure);
        sql.Append(" "); //  a space, that's all it is
        foreach (var key in sproc.Parameters.Keys)
        {
            sql.Append(string.Format("{0},", key));
            parms.Add(new SqlParameter(key, sproc.Parameters[key]));
        }
        if (sql[sql.Length - 1] == ',') // removing the trailing ,
        {
            sql.Remove(sql.Length - 1, 1);
        }
        return Database.SqlQuery<T>(sql.ToString(), parms.ToArray()).ToList();
}

返されるリストには正しい量の行(この場合はオブジェクト)が含まれていますが、どのプロパティにも値が入力されていません。procが200行を返す場合、リストに200個のオブジェクトが含まれていますが、値が入力されているオブジェクトはありません。

フィールド名と[Column( "name")]属性の値の間に不一致がないことを確認しました。結果セットのフィールド名と一致するようにプロパティ名を変更すると、正常に機能しますが、データ注釈を使用してそれらをマッピングしようとすると、機能しないようです。誰かが私がここで欠けているものを指摘できますか?簡単なことだと思います。

使用方法:Visual Studio 2010 Ultimate SP1、.Net 4 SP1、EF 4.2.0(EF 4.3でも同じ問題が発生しました)。これはすべてコードのみを使用して行われ、マッピングファイルは使用されません。

4

1 に答える 1

10

どうやら、これは文書化された動作です。Database.SqlQueryメソッドは、DbContextモデル構成に直接接続していません。

指定されたジェネリック型の要素を返す生のSQLクエリを作成します。タイプは、クエリから返された列の名前と一致するプロパティを持つ任意のタイプにすることも、単純なプリミティブ型にすることもできます。

したがって、このメソッドを使用するときは、結果セットの列名が使用されるタイプのプロパティ名と一致するようにSQLを構築する必要があります。

于 2012-05-25T15:04:49.753 に答える