Ich vergleiche Entity Framework mit NHibernate, und ich würde gerne wissen, ob bei Verwendung von SQL Server welcher Effekt (falls vorhanden) die MARS-Unterstützung aktivieren oder deaktivieren würde, auf NHibernate?
MARS = Mehrere aktive Ergebnismengen
Die Entity Framwork-Dokumentation gibt Folgendes an:
Wenn Sie die Methode
Load
während einerforeach
(C #) oderFor Each
aufrufen (Visual Basic) Aufzählung versucht das Entity Framework ein neues zu öffnen Datenleser. Dieser Vorgang schlägt fehl, wenn Sie nicht mehrere aktiviert haben aktive Ergebnismengen durch Angabe vonmultipleactiveresultsets=true
in der Verbindungszeichenfolge Weitere Informationen finden Sie unter Verwenden mehrerer aktiver Elemente Ergebnismengen (MARS) auf MSDN. Sie können das Ergebnis der Abfrage auch laden in eine List-Sammlung, die den Datenleser schließt und Ihnen ermöglicht um die Auflistung aufzuzählen, um referenzierte Entitäten zu laden.
Hat NHibernate das gleiche Problem?
Das Problem, auf das Sie sich beziehen, ist mit "serverseitigen Cursorn" verknüpft, und soweit ich von nHibernate weiß, sollte dies kein Problem sein , einfach weil es sie nicht verwendet .
Wenn Sie LINQ zum Laden von Objekten in nHibernate verwenden, lädt nHibernate beim ersten Zugriff auf die foreach-Enumeration das gesamte Resultset der Abfrage im Speicher, und auf diese Weise kann es die Verbindung der Sitzung verwenden, um alles andere zu laden.
Wenn Sie eine HQL-Abfrage oder ein Kriterium verwenden, wird die Ergebnismenge geladen, wenn Sie "List ()" aufrufen und dann die Verbindung schließen.
Entitätsframework auf der anderen Seite, versuchen Sie schlau zu sein und verwenden Server-Cursor beim Scrollen einer Sammlung über eine foreach-Enumeration, so dass die Verbindung des objectContext mit dem serverseitigen Cursor "beschäftigt" ist, bis die foreach-Enumeration beendet ist. Wenn MARS nicht aktiviert ist, kann EF die Verbindung nicht verwenden, um ein anderes Resultset zu laden (Sie können immer noch andere Anweisungen wie update, insert und delete ausgeben) und gibt Ihnen einen Fehler wie " Es gibt bereits einen offenen DataReader mit diesem Befehl verbunden, der zuerst geschlossen werden muss "oder etwas ähnliches.
Hoffe, das hilft,
Marco
EDIT:
Nach einigen Nachforschungen habe ich herausgefunden, dass nHibernate MARS verwenden kann, aber immer noch in Version 3.2.0.4000 gibt es keinen Treiber für SqlServer, der es unterstützt. Natürlich wird im SqlClientDriver nicht unterstützt (wie es für Sql2000 vorgesehen ist, das keine Unterstützung für MARS hat), aber selbst im Sql2008ClientDriver wird die relevante Eigenschaft auf false gesetzt. Jedenfalls werde ich dies so schnell wie möglich im nHibernate-Team posten.
Tags und Links sql-server nhibernate mars