【问题标题】:A member of the type, 'PropertyName', does not have a corresponding column in the data reader with the same name类型的成员“PropertyName”在数据读取器中没有同名的对应列
【发布时间】:2015-05-26 20:31:55
【问题描述】:

我正在使用 Entity Framework 6,代码优先,并使用 ObjectContext.Translate() 方法执行存储过程以填充对象列表。

我需要在存储过程中返回类的每个属性吗?或者我可以返回一些属性吗?

MSDN 文章 Directly Executing Store Commands 建议我应该能够返回 一些 属性:

如果类型属性的名称与 Db​​DataReader 的字段不匹配,则实体框架会具体化该属性的默认值(如果它是在概念模型中定义的)。

但是当我在存储过程中留下一个属性时,我得到一个错误。例如,假设 MyClass 具有 3 个属性:Id、Name、Description。如果我的存储过程返回以下内容:

SELECT Id, Name, Description from dbo.MyTable;

一切都很好。但是,如果我只返回两个属性,而忽略一个:

SELECT Id, Name from dbo.MyTable;

然后调用(其中“db”是 DbContext 的实例,“rdr”是 DbDataReader 的实例):

((IObjectContextAdapter)db).ObjectContext.Translate<MyClass>(rdr).ToList();

我收到错误消息“类型的成员‘描述’在数据读取器中没有同名的对应列。”

我误解了 MSDN 文章吗?我可以在调用 ObjectContext.Translate() 时从存储过程中返回 一些 属性吗?还是我必须始终返回所有属性?

或者“如果在概念(原文如此)模型中定义属性的默认值”这句话是否意味着我需要向我的模型类添加一些注释?

【问题讨论】:

    标签: c# ef-code-first entity-framework-6


    【解决方案1】:

    如果似乎 ObjectContext.Translate 要求所有属性都存在。

    提供的 DbDataReader 必须包含映射到请求的实体类型的数据。

    https://msdn.microsoft.com/en-us/library/dd466384%28v=vs.110%29.aspx

    【讨论】:

      【解决方案2】:

      这似乎是问题所在:我的项目缺少“概念模型”。也就是说,我使用的是普通的旧 clr 对象(PO​​CO),并没有使用实体数据模型向导生成 *.edmx 文件。

      正如 MSDN 所述:

      如果类型属性的名称与 Db​​DataReader 的字段不匹配,则实体框架会实现属性的默认值如果它是在概念模型中定义的

      由于我没有概念模型,我认为这就是 Entity Framework 没有为我“实现默认值”而是引发异常的原因。

      我假设如果我生成 *.edmx 文件(由于各种原因我不能在这个项目中这样做)并使用这些实体而不是我的 POCO 实体,错误消息将会消失。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-04
        相关资源
        最近更新 更多