Welchen Einfluss hat MARS auf NHibernate?

9

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 einer foreach (C #) oder For 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 von multipleactiveresultsets=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?

Zusätzliche Informationen bei der Verbindung mit SQL Azure

    
Matt Johnson 05.10.2011, 15:40
quelle

1 Antwort

4

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.

    
mCasamento 05.11.2011, 22:13
quelle

Tags und Links