Azure移动服务表控制器updateAsync最终会出现内存不足异常

时间:2016-04-16 09:09:10

标签: c# azure inheritance asp.net-web-api azure-mobile-services

当我运行一个运行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; }
}

并且tablecontroller补丁操作看起来像这样

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

所以我尝试修补Bars enumstatus,然后感觉它开始循环遍历所有相关的entites并开始更新它们。 我怎么解决这个问题?也许我应该重新考虑我的遗产

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

1 个答案:

答案 0 :(得分:0)

像延迟加载一样有趣,因此这可能很危险。我个人更喜欢禁用延迟加载并使用IQueryable<T>.Include方法仅包含与查询相关的相关实体,否则您可能会意外地最终拉动整个数据库。您可以在MobileServiceContext构造函数中关闭延迟加载:

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

您可以找到使用IQueryable<T>.Include()来完成预先加载here的合适示例。

希望这就是你要找的东西!