所以有一些其他类似类型的帖子,但没有一个匹配我正在尝试的简单任务。 只需按以下方式通过 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的问题,我尝试将其添加到类和/或从查询结果集中删除。
答案 0 :(得分:1)
自从从5升级和重构EF6以来,我们也看到了这个问题。存储过程返回,我们在edmx中定义了复杂类型。似乎所有内容都匹配,但在调用此类
时我们会遇到相同类型的错误return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<GetColumnValueSet_Result>("GetColumnValueSet", param1, param2, param3);
所以在尝试了一些事情之后,这就是我发现的。我打开了我的edmx并转到Visual Studio中的模型浏览器。在功能导入下我找到了我的sproc。右键单击并选择“函数导入映射”。事实证明,即使复杂类型是正确的,并且看起来一切都应该匹配,函数导入映射认为sproc正在返回一个名为CodeValue的列而不是Value(这实际上是导入的)。
因此,出于某种原因,当获取sproc列时,它的映射名称会出错。