10

使用 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.

我已经在服务应用程序中搜索了相关的实体和属性名称,尝试在表映射中重命名属性,似乎还有许多其他人报告了相同的错误,但似乎无法找到及时的答案...... .

...有谁知道如何追踪这一点,如果是这样,是否有解决方法或方法可以在未来避免?

4

6 回答 6

12

除了更新视图,您还可以更新函数导入:

  • 转到模型浏览器窗口
  • 展开实体容器
  • 在 Mapping Details 窗口中打开 Function Import
  • 如果实体名称(左列)与预期的字段名称(右列)不匹配,您可以更改右侧列以匹配实际调用的返回字段。
于 2011-06-27T19:45:37.283 回答
5

我有一个类似的问题,它产生了相同的错误消息 - 问题是 proc 返回的列名包含一个空格。

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

然后当用 , 执行 proc 时ExecuteStoreQuerymy_column数据读取器中不存在,因为 proc 仍然返回[my column]

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

于 2012-11-22T12:24:55.770 回答
4

Ok - here's the skinny:

That particular view was setup as a Return Type for a Stored Procedure that had to be setup as a Function Import in the Model's Entity Container.

I had updated that view to fit new reporting requirements, not realizing it's significance to the Function Import. The additional fields are not part of the data set recognized for this purpose, so it couldn't find a match for any of them.

So I duplicated the view and suffixed it with 'Report', then reverted the original back to it's expected set of return fields.

Voila!

于 2009-09-29T19:51:51.677 回答
2

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

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

于 2013-12-28T18:36:48.963 回答
1

我最近在使用 Sprocs 时遇到了同样的问题。我在存储过程中有一些条件 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 在将列映射到属性时也没有什么可匹配的。

希望能帮助到你。

于 2013-04-22T16:16:48.040 回答
0

简单的方法:

  1. 一旦 SP 完成更新 EF 模型,使其可用。
  2. 在SP中加入PRINT语句,重新编译运行。
  3. 注释掉 Dynamic SQL 并放入 PRINT 语句,重新编译确保它运行。
  4. 现在在 EF 中执行函数导入,列将显示。
  5. 将 SP 改回动态代码,一切都很好:)
于 2014-03-17T21:15:07.407 回答