【问题标题】:The data reader is incompatible with the specified class数据读取器与指定的类不兼容
【发布时间】:2014-08-28 16:24:39
【问题描述】:

所以还有一些其他类似类型的帖子,但没有一个与我正在尝试的简单任务相匹配。 只需通过 EF6 代码首先以下列方式运行存储过程

var results = context.DataBase.SqlQuery<MyClass>("exec spGetStuff @param1, @param2", new SqlParameter[] {new SqlParameter("param1",value), new SqlParameter("param2", value2)});

我在很多场合都使用过这种方法,没有任何问题。 我将结果映射到的类非常讨厌,有很多属性,但所有需要它的都标有[Column("dbfieldname")] 属性。

所有存储过程正在做的是通过使用返回一些结果

SELECT * FROM(
SELECT 
    ROW_NUMBER() OVER ( PARTITION BY X,Y,Z ORDER BY A) [RowNumber]
,*
FROM
MyTableNAme
WHERE
...) S
WHERE s.RowNumber = 1

不插入、更新或任何类似的幻想。

数据读取器与指定的“MyClass”不兼容。类型的成员“PropertyNameName”在数据读取器中没有同名的对应列。

如果我确实将类属性更改为 db 列名,它似乎可以正常工作:我可以更改前几个属性,然后它将在类中的其他属性上失败......但是我真的不想这样做如果我可以避免它,因为数据库中的大多数列的命名确实非常糟糕,所以我想我的问题是为什么它忽略了以前从未让我失望过的[Column()] 属性。 或者是row_number的问题,我尝试将其添加到类和/或从查询结果集中删除。

【问题讨论】:

    标签: c# stored-procedures code-first entity-framework-6 row-number


    【解决方案1】:

    自从 EF6 从 5 升级和重构以来,我们也看到了这个问题。存储过程返回,我们在 edmx 中定义了一个复杂类型。似乎一切都匹配,但我们在这样调用时得到相同类型的错误

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<GetColumnValueSet_Result>("GetColumnValueSet", param1, param2, param3);
    

    所以在尝试了一些事情之后,这就是我发现的。我打开了我的 edmx 并进入了 Visual Studio 中的模型浏览器。在 Function Imports 下,我找到了我的 sproc。右键单击并选择函数导入映射。事实证明,即使复杂类型是正确的并且看起来一切都应该与函数导入映射匹配,但函数导入映射认为 sproc 正在返回一个名为 CodeValue 而不是 Value 的列(这是它实际导入的)。

    因此,由于某种原因,当获取 sproc 列时,它的映射名称错误。

    【讨论】:

    • 嗨,感谢您的回复。我没有说清楚我是先使用代码,所以我没有 edmx。最终对存储过程中的所有列进行了别名处理,这远非理想。 :(
    猜你喜欢
    • 1970-01-01
    • 2021-02-28
    • 2013-09-18
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多