Azure Mobile Services表控制器updateAsync最终出现内存不足异常

本文关键字:内存不足 异常 updateAsync Mobile Services 控制器 Azure | 更新日期: 2024-09-21 04:47:12

当我运行一个运行updateAsync(id,patch)的补丁方法时,我会陷入一个我认为是无限引用循环的循环,然后随着服务器因内存不足异常而崩溃而停止。

所以我有型号

  public class User : EntityData
{
    public string Username { get; set; }
    public virtual ICollection<Bar> Bars { get; set; }
    public virtual ICollection<Foo> Foos { get; set; }
}
public class Bar: EntityData
{
    public string FooId { get; set; }
    public string UserId { get; set; }
    public enum enumStatus { get; set; }
    public virtual Foo Foo { get; set; }
    public virtual User User { get; set; }
} 
public class Foo: EntityData
{
   public string Title { get; set; }
   public string UserId { get; set; }
   public virtual ICollection<Bar> Bars { get; set; }
   public virtual User User { get; set; }
}

表控制器的补丁操作看起来像这个

public Task<Bar> PatchInvited(string id, Delta<Bar> patch)
{
     return UpdateAsync(id, patch);
}

所以我尝试修补Bars enumstatus,然后感觉它开始循环所有相关的实体,并开始更新它们。我该如何解决这个问题?也许我应该重新思考我的继承

更新1:经过进一步调查,它似乎在没有我要求的情况下加载了所有相关实体。为什么会发生这种情况?

Azure Mobile Services表控制器updateAsync最终出现内存不足异常

尽管懒惰加载很有趣,但由于这个原因,它可能很危险。我个人更喜欢禁用延迟加载,并使用IQueryable<T>.Include方法只包括与查询相关的相关实体,否则您可能会意外地拉取整个数据库。您可以在MobileServiceContext构造函数中关闭延迟加载:

    public MobileServiceContext() : base(connectionStringName)
    {
        Configuration.LazyLoadingEnabled = false;
        Configuration.ProxyCreationEnabled = false;
    }

您可以在这里找到一个使用IQueryable<T>.Include()来完成急切加载的好例子。

希望这就是你想要的!