类型为“PropertyName”的成员在数据阅读器中没有相应的列,名称相同

时间:2015-05-26 20:31:56

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

我正在使用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()时从存储过程返回某些属性吗?或者我必须始终返回所有属性吗?

或者,如果在conceptutal(sic)模型中定义属性“实现属性的默认值”意味着我需要在模型类中添加一些注释吗?

2 个答案:

答案 0 :(得分:0)

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

  

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

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

答案 1 :(得分:0)

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

正如MSDN所述:

  

如果类型属性的名称与DbDataReader的字段不匹配,则实体框架将实现属性的默认值(如果在概念模型中定义)。

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

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