【问题标题】:Why won't my columns with Data Annotations map when using Entity Framework为什么在使用实体框架时我的带有数据注释的列不会映射
【发布时间】:2012-05-25 14:58:19
【问题描述】:

我有一个如下所示的课程:

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 行,那么我会在 List 中获得 200 个对象,但它们都没有填充任何值。

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

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

【问题讨论】:

    标签: c# entity-framework data-annotations


    【解决方案1】:

    看起来,这是记录在案的行为。 Database.SqlQuery Method 与 DbContext 模型配置没有直接联系。

    创建一个原始 SQL 查询,该查询将返回给定泛型的元素 类型。 类型可以是任何具有匹配属性的类型 从查询返回的列的名称,或者可以是一个简单的 原始类型。

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

    【讨论】:

    • 三年后,这个答案帮助了我。我有一个无法更改的数据模型,但列名不符合我们的命名约定。在我用来反序列化查询的 POCO 中,我为数据库中的每一列创建了一个私有字段,以及一个具有正确命名属性的公共字段,仅公开一个 getter 方法来返回私有字段中的值。这可能会在另外三年内帮助某人。
    • 又过了 14 个月,它帮助了我 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多