我们上周在出于内部目的开发新项目时遇到了一个奇怪的问题。我们正在Azure SQL数据库上使用存储过程来获取一些数据。然后是实体框架,将数据库映射到数据服务上下文模型。然后将其公开为OData服务,样板等,等等。
我们从客户那里得到如下结果:
OurDataServiceContext.Execute<OurResultsModel>(oDataQueryUri, "GET", false);
这里没什么特别的或有趣的。实际上,可以在我们项目的其他地方找到相同的代码。但是,在这种情况下,每当枚举QueryOperationResponse的结果时,都会发生异常。
System.InvalidCastException: 'Unable to cast object of type 'System.String' to type 'OurResultsModel'
这完全让我自己和团队的其他两名成员感到沮丧。请记住,存储过程似乎没有什么问题:我们可以执行该存储过程并获得预期的结果。 OData服务本身似乎也没有出错:提琴手查询,在浏览器查询中,没问题! 最终,我创建了一个新类'OurResultsModel2',然后:
OurDataServiceContext.IgnoreMissingProperties = true;
OurDataServiceContext.Execute<OurResultsModel2>(oDataQueryUri, "GET", false);
我打算删除属性,直到它起作用为止。幸运的是,我能够在第一次尝试时枚举结果。我还能够使用这种类型复制InvalidCastException。所以,这是我的问题:什么?我到底做了什么来解决这个问题?
更多细节...
我们的存储过程看起来像这样...
SELECT mt.ID AS ID, mc.Qty AS MorningCount,
[...another couple of nullable int columns, and a descriptive string...]
FROM [...a derived table grouped by mt.ID...]
我们将“ mt.ID AS ID”更改为“ mt.ID AS MealID”,一切正常。那么,又怎样呢?我似乎找不到与WCF,OData或EntityFramework相关的任何规则,说“不要命名存储过程ID的列”。我找不到任何记录在案的规则,或者在这里或任何其他论坛上都找不到类似的问题。因此,可能有些误解。而且肯定有一些我不知道的东西。
希望有人可以帮我解决这个问题!