Wie verhindere ich, dass Entity Framework eine FileStream-Spalte in ein Byte-Array lädt?

8

Ich entwickle eine Dateispeicheranwendung und wir haben den FileStream-Typ in unsere Datenbank aufgenommen. Das System wird voraussichtlich große Dateien unterstützen. Ein Teil der Anwendung ermöglicht Bulk-Uploads mehrerer Dokumente. Diese Dokumente müssen dann mit anderen Entitäten innerhalb des Systems verknüpft werden.

Auf einer Seite werden nicht verknüpfte Dokumente angezeigt, damit ein Benutzer die Dokumente einzeln mit Entitäten verknüpfen kann. Nach einigen Belastungstests des Upload-Prozesses haben wir festgestellt, dass der Arbeitsspeicherbedarf des ASP.NET-Worker-Prozesses beim Laden dieser Seite für nicht verknüpfte Dokumente auf einen GB-Wert erhöht wurde.

Nach der Untersuchung scheint Entity Framework die gesamte Entität der Dokumentzeile (einschließlich des in ein Byte-Array konvertierten FileStream) für Hunderte von nicht verknüpften Dokumenten zu laden. In meiner Repository-Klasse speichere ich dieses Byte-Array bei der Konvertierung in ein Model nicht, aber dann ist es zu spät. EF hat die Zeit und den Speicher ausgegeben, um das Byte-Array der Repräsentation der Repository-Klasse zuzuweisen.

Gibt es eine Möglichkeit, dass ich EF anweisen kann, dieses Byte-Array nicht zu laden, wenn ich nicht explizit danach frage?

    
Garrison Neely 19.04.2012, 21:02
quelle

1 Antwort

11

Garnison, Sie können eine Funktion namens "Entity Splitting" verwenden, bei der Sie zwei verknüpfte Entitäten einer einzelnen Tabelle zuordnen. In der ersten Entität hätten Sie also alle außer der Filestream-Eigenschaft. In der zweiten Entität hätten Sie den Primärschlüssel (wie in der ersten Entität) und die Filestream-Eigenschaft. Erstellen Sie eine Eins: Eins-Beziehung zwischen den Entitäten in Ihrem Modell und ordnen Sie dann beide Entitäten derselben Tabelle zu. Jetzt ist die Entität mit dem Filestream verwandt und Sie können sie laden oder nach Bedarf laden. Der einzige Nachteil besteht darin, dass es sich nicht um eine Eigenschaft Ihrer Haupteinheit handelt. Sie müssen also zur zugehörigen Entität und dann zur Eigenschaft navigieren.

myEntity.MyRelatedEntity.TheFileStreamProperty

Hier ist ein alter Blogpost Ich habe geschrieben, das zeigt, wie man das im EDM Designer macht.

Sie können das gleiche Mapping auch mit Code FIrst erreichen. Hier ist ein MSDN-Artikel, den ich geschrieben habe, der einen Entity Splitting-Artikel enthält. Ссылка

HTH Julie

    
Julie Lerman 20.04.2012, 00:08
quelle