类型的成员“PropertyName”在数据读取器中没有同名的对应列

Posted

技术标签:

【中文标题】类型的成员“PropertyName”在数据读取器中没有同名的对应列【英文标题】:A member of the type, 'PropertyName', does not have a corresponding column in the data reader with the same name 【发布时间】: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() 时从存储过程中返回 一些 属性吗?还是我必须始终返回所有属性?

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

【问题讨论】:

【参考方案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 实体,错误消息将会消失。

【讨论】:

以上是关于类型的成员“PropertyName”在数据读取器中没有同名的对应列的主要内容,如果未能解决你的问题,请参考以下文章

Spring_02

php魔术方法

C++中如何将两个连续的string 类型存入到文件中并读取出来?

类成员

无法读取和格式化日期

未满足 boost::asio 读取处理程序类型要求