我正在使用Odata和Entity Framework的Azure Mobile应用服务。我有大约90列的表,除非我注释掉数据模型中的一些列,否则它不起作用。如果包含所有列,那么我注释掉查询的列将无效。
azure移动服务调试器告诉我: “EntityFramework.dll中发生了'System.StackOverflowException'类型的未处理异常”odata查询工作正常并返回200 ok但是EF与SQL(它是一个天蓝色的sql服务器)交谈有一个怪胎并且永远不会返回任何内容。直到我从数据模型中删除一些列。
这只是开箱即用的数据模型和tablecontrollers,我正在使用Postman发送查询。我在此服务中有20个其他表可以完美运行。我无法根据您可以使用的列数找到大小限制或任何内容。任何帮助都很棒。
邮差给了我: “502 - Web服务器在充当网关或代理服务器时收到无效响应”,但这太过于通用而无法跟踪。查看了所有可能的天蓝色日志。只是说有一个错误
答案 0 :(得分:0)
我建议您Enable diagnostics logging为您的移动应用收集详细的错误消息。此外,您可以修改TableController并记录详细的SQL语句,如下所示:
protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
var context = new MobileServiceContext();
//add this line
context.Database.Log += (msg) =>
{
System.Diagnostics.Trace.TraceInformation($"{msg}{Environment.NewLine}");
};
DomainManager = new EntityDomainManager<Message>(context, Request);
}
此外,您可以通过SSMS执行相关的SQL语句,并检查查询执行计划以缩小此问题。此外,对于您的移动客户端,您只能从远程表中检索特定列。这是C#的代码片段:
var query =
from r in table.CreateQuery()
select new { r.Text, r.Complete, r.UpdatedAt, r.Version };
答案 1 :(得分:0)
经过8个月的随机尝试,我实际上开始工作了!
与其直接从内置于AzureMobileServiceServer命名空间的帮助器中返回IQueryable,而是将其转换为IEnumberable,然后重新选择所有内容,然后将其更改回IQueryable。不知道为什么这行得通,但它消除了否则会发生的stackoverflow问题。我认为这在离线同步时会增加一些时间,但如果可以,我会接受。
public IQueryable<ItemLibrary> GetAllItemLibrarys()
{
//return Query(); //!!!this is the original from the table controller
return Query().AsEnumerable().Select(s => s).AsQueryable(); //!!!replace with this
}