2016-04-16 12 views
2

Wenn ich eine Patch-Methode ausführen, die updateAsync(id,patch) ausgeführt wird, komme ich in eine unendliche Referenzschleife, die mit dem Server abstürzt mit out of memory Ausnahme stoppt .Azure Mobile Services Tabellencontroller updateAsync endet in Speichermangel Ausnahme

So habe ich die Modelle

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

und die tablecontroller Patch Aktion sieht wie folgt aus

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

Also ich versuche enumStatus Bars zu patchen und dann fühlt es sich wie es durch alle damit verbundenen entites beginnt looping und fängt an, sie auch zu aktualisieren. Wie kann ich das lösen? Vielleicht sollte ich meine Erbschaft überdenken

Update 1: Nach weiterer Untersuchung scheint es alle verwandten Entitäten zu laden, ohne dass ich danach frage. Warum passiert dies?

+0

Entsprechende Entitäten werden geladen, da Ihre 'Navigationseigenschaften' als' virtuell' gekennzeichnet sind, dh lazy loaded. Ich würde empfehlen, 'Data Transfer Objects' zu verwenden, um die korrekten Daten abzubilden, die vom Dienst benötigt werden, anstatt alles zu laden (langsame, unendliche Schleifen usw.). Haben Sie eine relevante Ausnahme-Nachricht? – SWilko

+0

Okay, also ein DTO zu lösen, aber ich verstehe nicht, warum es alle virtuellen Daten lädt? Wenn Sie ein DTO machen, wird die Idee, ODATA zu verwenden, gebrochen? –

Antwort

0

So viel Spaß wie Lazy Loading ist, kann es aus diesem Grund gefährlich sein. Ich persönlich bevorzuge es, lazy loading zu deaktivieren und die IQueryable<T>.Include Methode zu verwenden, um nur die relevanten Entitäten einzuschließen, die für die Abfrage relevant sind, sonst kann es passieren, dass Sie versehentlich Ihre gesamte Datenbank ziehen. Sie können verzögertes Laden im MobileServiceContext Konstruktor deaktivieren:

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

Sie ein anständiges Beispiel für die Verwendung IQueryable<T>.Include()here eifrig Laden zu erreichen finden.

Hoffentlich das ist, was Sie suchen!

Verwandte Themen