2016-05-20 15 views
0

Ich bin mit EF (EF-Core eigentlich mit ASP.NET-Core auf OSX, aber ich glaube, das ist eher eine allgemeine "newbie-style" EF Frage ist, so lesen Sie bitte weiter ...)Entity Framework Speicherverwaltung und Dispose?

Ich habe eine kleine Protokollierungsroutine erstellt, die EF verwendet, um Protokolleinträge in meiner Datenbank zu veröffentlichen. So ähnlich wie diese, von einer Repository-Klasse aufgerufen:

WebLog log = new WebLog(source, path, message); 
Context.WebLogs.Add(log); 
Context.SaveChanges(); 

Wo WebLog eine einfache Modellklasse ist, ist Context.WebLogs eine DbSet<WebLog> Sammlung und Context ist offensichtlich die DbContext. Ich glaube, das ist ziemlich einfach.

Aber meine Frage ist das: Wenn ich fortfahren, neue Protokolleinträge in die Context.WebLogs Sammlung hinzuzufügen, und ich nie etwas wie meinen Server neu starten, ist die Sammlung nicht einfach wachsen ohne Grenzen? Gibt es irgendeine Art von "Bereinigen" oder "Flush" -Aktion, die ich regelmäßig durchführen kann, um die Speichernutzung zu verwalten (ohne die festgeschriebenen Zeilen in der Datenbank zu beeinflussen, natürlich - möchte ich, dass diese bestehen bleiben). Oder ist DbSet eine Art spezielle Sammlung, die das nicht tun wird?

+0

Die Aktion, nach der Sie suchen, trennt nur alle Entitäten, die sich in einem Status "Unverändert" befinden. Ich bezweifle stark, dass EF so etwas alleine machen würde, was einer der Gründe dafür ist, dass die Lebensdauer des Kontextes (Eintrittszeitraums) begrenzt sein sollte. – DevilSuichiro

Antwort

0

Wie oben von DevilSuichiro erwähnt, wird empfohlen, die Lebensdauer der Instanzen von DbContext zu begrenzen. Z.B. In einer Webanwendung verwenden Sie normalerweise eine DbContext Instanz pro Anfrage, sodass eine unbegrenzte Anzahl an hinzugefügten Entitäten kein Problem darstellt.

Am nächsten an einer "Flush" -Operation ist SaveChanges(), dass die Methode nicht versuchen wird, Verweise auf verfolgte Entitäten zu entfernen, da DbContext nach SaveChanges() wiederverwendet werden soll.

In früheren Versionen von EF hatten wir eine Detach() API, die Sie verwenden könnten, um eine einzelne verfolgte Referenz loszuwerden, aber wir haben diese API nicht in DbContext oder irgendwo in EF Core.

BTW, mit einer Instanz von DbContext, die zwischen mehreren Anforderungen geteilt wird, ist äußerst problematisch, weil DbContext nicht Thread sicher ist.