Azure 移动应用服务和 EF Table 列限制?
Azure Mobile app service & EF Table Column Restriction?
我正在使用带有 Odata 和 Entity Framework 的 Azure 移动应用服务。我有 table 大约有 90 列,除非我注释掉数据模型中的某些列,否则它不起作用。我注释掉哪些列并不重要,如果对所有列都进行查询,查询将不起作用。
Azure 移动服务调试器告诉我:
"An unhandled exception of type 'System.WhosebugException' occurred in EntityFramework.dll" odata 查询工作正常并且 returns 200 正常但是随后与 SQL(它是一个 azure sql 服务器)交谈的 EF 出现了异常并且从未 returns 任何...直到我从数据模型中删除一些列。
这只是开箱即用定义的数据模型和 table控制器,我正在使用 Postman 发送查询。我在这项服务中还有 20 个其他 table 可以完美运行。我找不到大小限制或任何基于您可以使用的列数的东西。任何帮助都很棒。
邮递员给我:
“502 - Web 服务器在充当网关或代理服务器时收到无效响应”,但这太笼统而无法追踪。查看所有可能的天蓝色日志,但什么也没有。刚说有错误
我建议您 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 语句并检查查询执行计划以缩小此问题的范围。此外,对于您的移动客户端,您只能从远程 table 检索特定的列。这里是 C# 的代码片段:
var query =
from r in table.CreateQuery()
select new { r.Text, r.Complete, r.UpdatedAt, r.Version };
经过 8 个月的随机尝试,我终于成功了!
不是直接从 AzureMobileServiceServer
命名空间中内置的助手返回 IQueryable
,而是将其转换为 IEnumerable
,然后重新 select 所有内容,然后更改它回到 IQueryable
.
不知道为什么会这样,但它可以解决否则会发生的 Whosebug 问题。我认为这会在离线同步时增加一点时间,但如果可行,我会接受它。
public IQueryable<ItemLibrary> GetAllItemLibrarys()
{
// return Query(); // !! this is the original from the table controller
return Query().AsEnumerable()
.Select(s => s).AsQueryable(); // !! replace with this
}
我正在使用带有 Odata 和 Entity Framework 的 Azure 移动应用服务。我有 table 大约有 90 列,除非我注释掉数据模型中的某些列,否则它不起作用。我注释掉哪些列并不重要,如果对所有列都进行查询,查询将不起作用。
Azure 移动服务调试器告诉我: "An unhandled exception of type 'System.WhosebugException' occurred in EntityFramework.dll" odata 查询工作正常并且 returns 200 正常但是随后与 SQL(它是一个 azure sql 服务器)交谈的 EF 出现了异常并且从未 returns 任何...直到我从数据模型中删除一些列。
这只是开箱即用定义的数据模型和 table控制器,我正在使用 Postman 发送查询。我在这项服务中还有 20 个其他 table 可以完美运行。我找不到大小限制或任何基于您可以使用的列数的东西。任何帮助都很棒。
邮递员给我: “502 - Web 服务器在充当网关或代理服务器时收到无效响应”,但这太笼统而无法追踪。查看所有可能的天蓝色日志,但什么也没有。刚说有错误
我建议您 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 语句并检查查询执行计划以缩小此问题的范围。此外,对于您的移动客户端,您只能从远程 table 检索特定的列。这里是 C# 的代码片段:
var query =
from r in table.CreateQuery()
select new { r.Text, r.Complete, r.UpdatedAt, r.Version };
经过 8 个月的随机尝试,我终于成功了!
不是直接从 AzureMobileServiceServer
命名空间中内置的助手返回 IQueryable
,而是将其转换为 IEnumerable
,然后重新 select 所有内容,然后更改它回到 IQueryable
.
不知道为什么会这样,但它可以解决否则会发生的 Whosebug 问题。我认为这会在离线同步时增加一点时间,但如果可行,我会接受它。
public IQueryable<ItemLibrary> GetAllItemLibrarys()
{
// return Query(); // !! this is the original from the table controller
return Query().AsEnumerable()
.Select(s => s).AsQueryable(); // !! replace with this
}