2016-04-16 22 views
2

updateAsync(id,patch)を実行するパッチメソッドを実行しているときに、メモリ不足例外が発生してサーバーが停止して停止する無限の参照ループになる。AzureモバイルサービスTablecontroller updateAsyncがメモリ不足例外で終了する

だから私はモデル

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); 
} 

のように見えるので、私はバーenumstatusにパッチを適用しようとすると、それはすべての関連entitesをループを開始するようにそれは感じていますそれらの更新も開始されます。 どうすればこの問題を解決できますか?たぶん私の遺産を再考すべきです

更新1:それ以上の調査の後、私はそれを求めないで、関連するすべてのエンティティを読み込むようです。なぜこうなった?

+0

関連するエンティティは 'ナビゲーションプロパティ 'として読み込まれ、'仮想 '、すなわち遅延ロードされているとマークされます。私は 'Data Transfer Objects'を使用して、すべてのもの(遅い、無限ループなど)をロードするのではなく、サービスが必要とする正しいデータをマップすることをお勧めします。関連する「例外」メッセージがありますか? – SWilko

+0

さて、DTOを使って解決しましたが、なぜそれがすべての仮想データを読み込むのか分かりません。 ODATAを使用するというアイデアは、DTOのよ​​うなものを壊してしまいますか? –

答えて

0

遅延読み込みと同じように楽しいので、危険です。私は個人的には遅延ロードを無効にし、IQueryable<T>.Includeメソッドを使用してクエリに関連する関連エンティティのみを含めることをお勧めします。そうしないと、誤ってデータベース全体が取得される可能性があります。あなたはMobileServiceContextコンストラクタで遅延ロードをオフにすることができます:あなたは熱心ロードhereを達成するためにIQueryable<T>.Include()を使用してのまともな例を見つけることができます

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

うまくいけば、これはあなたが探しているものです!