使用Entity Framework时,为什么我的数据注释列不会映射

r_n*_*mez 3 c# entity-framework data-annotations

我有一个看起来像这样的课程:

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; }
}
Run Code Online (Sandbox Code Playgroud)

这个对象就是这样填充的(下一部分是在一个继承自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();
}
Run Code Online (Sandbox Code Playgroud)

返回的List包含正确数量的行(在这种情况下为对象),但没有任何属性填充值.如果proc返回200行,那么我在List中获得200个对象,但它们都没有填充任何值.

我已经验证了字段名称与[Column("name")]属性中的值之间没有不匹配.如果我更改属性名称以匹配结果集中的字段名称,那么它工作正常,但如果我尝试使用数据注释映射它们,我似乎无法使其工作.任何人都可以指出我在这里缺少什么?我确信这很简单.

使用:Visual Studio 2010 Ultimate SP1,.Net 4 SP1,EF 4.2.0(我遇到了与EF 4.3相同的问题).这只是使用代码完成的,没有使用映射文件.

arc*_*hil 8

看起来,这是记录在案的行为.Database.SqlQuery方法没有直接连接到DbContext模型配置.

创建将返回给定泛型类型的元素的原始SQL查询.类型可以是具有与查询返回的列的名称匹配的属性的任何类型,也可以是简单的基本类型.

因此,在使用此方法时,应构造sql,以使结果集列名与所用类型的属性名匹配.

  • 三年后,这个答案帮助了我。我有一个无法更改的数据模型,但是列名与我们的命名约定不符。在用来反序列化查询的POCO中,我为数据库中的每个列创建了一个私有字段,并为公共字段创建了正确命名的属性,仅公开了一种getter方法来返回私有字段中的值。这可能会在三年后帮助某个人。 (2认同)