类型的成员“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 建议我应该能够返回 一些 属性:
如果类型属性的名称与 DbDataReader 的字段不匹配,则实体框架会具体化该属性的默认值(如果它是在概念模型中定义的)。
但是当我在存储过程中留下一个属性时,我得到一个错误。例如,假设 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 对象(POCO),并没有使用实体数据模型向导生成 *.edmx 文件。
正如 MSDN 所述:
如果类型属性的名称与 DbDataReader 的字段不匹配,则实体框架会实现属性的默认值如果它是在概念模型中定义的。
由于我没有概念模型,我认为这就是 Entity Framework 没有为我“实现默认值”而是引发异常的原因。
我假设如果我生成 *.edmx 文件(由于各种原因我不能在这个项目中这样做)并使用这些实体而不是我的 POCO 实体,错误消息将会消失。
【讨论】:
以上是关于类型的成员“PropertyName”在数据读取器中没有同名的对应列的主要内容,如果未能解决你的问题,请参考以下文章