数据读取器与指定的类不兼容

时间:2014-08-28 16:24:40

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

所以有一些其他类似类型的帖子,但没有一个匹配我正在尝试的简单任务。 只需按以下方式通过 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

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

  

数据阅读器与指定的&#39; MyClass&#39;不兼容。类型的成员&#39; PropertyNameName&#39;在数据阅读器中没有相应的列具有相同的名称。

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

1 个答案:

答案 0 :(得分:1)

自从从5升级和重构EF6以来,我们也看到了这个问题。存储过程返回,我们在edmx中定义了复杂类型。似乎所有内容都匹配,但在调用此类

时我们会遇到相同类型的错误
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<GetColumnValueSet_Result>("GetColumnValueSet", param1, param2, param3);

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

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