数据读取器不兼容...成员在数据读取器中没有相应的列

时间:2009-09-29 18:50:19

标签: wpf visual-studio-2008 sql-server-2008 model entity

使用VS 2008,SQL Server 2008和WPF 3.5,我对我的架构进行了一些更改并更新了模型。它编译并运行正常,直到客户端应用程序调用特定实体,我得到以下(实际名称替换):

The data reader is incompatible with the specified '<Model>.<ViewBasedEntity>'. A member of the type, '<Property>', does not have a corresponding column in the data reader with the same name.

我在服务应用中搜索了相关的实体和属性名称,尝试在表格地图中重命名属性,似乎是其他一些报告相同错误的人,但似乎无法及时找到答案....

...有没有人知道如何追踪这一点,如果有的话,是否有一个修复或方法可以遵循以避免将来?

7 个答案:

答案 0 :(得分:12)

您也可以更新功能导入:

,而不是更新视图
  • 转到“模型浏览器”窗口
  • 展开EntityContainer
  • 在“映射详细信息”窗口中打开“功能导入”
  • 如果实体名称(左列)与预期的字段名称(右列)不匹配,则可以更改右侧列以匹配实际调用的返回字段。

答案 1 :(得分:5)

我遇到了类似的问题,产生了同样的错误信息 - 问题是proc返回的列名包含空格。

创建复杂类型时,[my column]创建为my_column

然后在使用ExecuteStoreQuery执行proc时,数据阅读器中不存在my_column,因为proc仍然返回[my column]

解决方案:从proc列名称中删除空格,然后为导入的函数重新创建复杂类型。

答案 2 :(得分:4)

好的 - 这是瘦的:

该特定视图设置为存储过程的返回类型,必须在模型的实体容器中设置为函数导入。

我更新了该视图以符合新的报告要求,但没有意识到它对功能导入的重要性。附加字段不是为此目的而识别的数据集的一部分,因此无法找到任何匹配的字段。

所以我复制了视图,并以“报告”为后缀,然后将原始版本恢复为预期的返回字段集。

瞧!

答案 3 :(得分:2)

请查看this博文。查看Divan Moller的第一条评论。可能对你有帮助。

答案 4 :(得分:2)

我见过这种情况发生在改变结果集的数据对象上(例如带有if语句的sproc)错误消息是实体框架工作/数据读取器告诉你它预期列x并且没有返回。< / p>

要解决这个问题,你可以 a)确保您的sproc的所有路径返回相同的列名 b)使用Database.ExecuteSqlCommand

答案 5 :(得分:1)

我最近在使用Sprocs时遇到了同样的问题。我在sproc中有一些conditonal SQL,就像几个'if'语句一样

IF @param1 = 'knownValue'
BEGIN
SELECT * FROM EntityType WHERE ID = 'somevalue'
END
ELSE IF @param1 = 'knownValue2'
BEGIN
SELECT * FROM EntityType WHERE ID = 'somevalue'
END

这是我的EF代码:

return context.Database.SqlQuery<EntityType>(
            "[NAV].[GeEntityType] @Date, @ID",
            new SqlParameter("Date", paramDate),
            new SqlParameter("ID", paramId)).ToList();

我没有提供任何'if'语句都没有返回true的情况,因此sproc甚至没有返回空结果集并导致EF抛出此错误。即使没有返回空读者,在将列映射到属性时,EF也无法匹配。

希望它有所帮助。

答案 6 :(得分:0)

简单方法:

  1. SP完成后,更新EF模型,以便它可用。
  2. 将PRINT语句添加到SP,重新编译并运行。
  3. 注释掉动态SQL并输入PRINT语句,重新编译确保它运行。
  4. 现在在EF中执行功能导入,列将显示。
  5. 将SP更改回动态代码和所有商品:)