sql server - enable - ¿Qué efecto tiene MARS en NHibernate?
la conexión no es compatible con multipleactiveresultsets (1)
Estoy comparando Entity Framework con NHibernate, y me gustaría saber si al usar SQL Server, ¿qué efecto (si lo hubiera) habilitaría o deshabilitaría el soporte de MARS en NHibernate?
MARS = Conjuntos de resultados activos múltiples
La documentación de Entity Framwork establece lo siguiente:
Cuando llama al método
Load
durante una enumeraciónforeach
(C #) oFor Each
(Visual Basic), Entity Framework intenta abrir un nuevo lector de datos. Esta operación fallará a menos que haya habilitado múltiples conjuntos de resultados activos especificandomultipleactiveresultsets=true
en la cadena de conexión. Para obtener más información, vea Usar conjuntos de resultados activos múltiples (MARS) en MSDN. También puede cargar el resultado de la consulta en una colección de Lista, que cierra el lector de datos y le permite enumerar sobre la colección para cargar las entidades a las que se hace referencia.
¿NHibernate tiene el mismo problema?
El problema al que se refiere está relacionado con los "cursores del lado del servidor", y hasta donde yo sé de nHibernate esto no debería ser un problema , simplemente porque no los usa.
Si está utilizando LINQ para cargar objetos en nHibernate, en el primer acceso a la enumeración foreach, nHibernate carga en la memoria todo el conjunto de resultados de la consulta, y de esta manera puede usar la conexión de la sesión para cargar todo lo demás. Al utilizar la consulta HQL o Criteria, cargará el conjunto de resultados cuando llame a "List ()" y luego cerrará la conexión.
Entity framework en la otra cara, intente ser inteligente y utilice los cursores del lado del servidor al desplazar una colección a través de una enumeración foreach, de modo que la conexión de objectContext esté "ocupada" con el cursor del servidor hasta que finalice la enumeración foreach. Si MARS no está habilitado, EF no puede usar la conexión para cargar otro conjunto de resultados (todavía puede emitir otras declaraciones, como actualización, insertar y eliminar) y así le dará un error como " Ya hay un DataReader abierto asociado con este Comando que debe cerrarse primero "o algo similar.
Espero que esto ayude,
Marco
EDITAR:
Después de algunas investigaciones, descubrí que nHibernate podría usar MARS, pero aún en la versión 3.2.0.4000 no hay ningún controlador para SqlServer que lo admita. Por supuesto, en el SqlClientDriver no es compatible (ya que se trata de Sql2000 que no admite MARS), pero incluso en Sql2008ClientDriver, la propiedad relevante se establece en falsa. De todos modos, esto es algo que publicaré en el equipo nHibernate lo antes posible.