Bueno, la historia es ya conocida, cuando trabajamos con NHibernate no es conveniente usar identity, hay cosas de NHibernate que no se aprovechan. Cuando se usa Identity y se realiza un Save(), NHibernate tiene que forzar el INSERT para obtener el Id, por lo tanto el concepto de Unidad de trabajo no es explotado.
Ahora sumémosle este bug, que la gente del SQL Server team después de evaluar dice: ?Desafortunadamente, después de evaluar las opciones para solucionar el problema, llegamos a la conclusión que no podemos arreglarlo para Sql Server 2008?
Conclusión
Si usas NHibernate+SQL Server, no te aconsejo identity como generador de identificadores en producción. Una muy buena opción que tiene muchas bondades es usar como generador a hilo.
#1 by Fernnado on April 6th, 2009
Hola soy nuevo utilizando NHibernate, y poco a poco voy profundizando en él. Cada vez me gusta más, hasta el punto que estoy seriamente decidido a comenzar un proyecto con esta tecnología.
Sin embargo, me sorprende tu post. Recomiendas no utilizar identity con NHibernate y SQL Server, y lo dices como si fuera algo más o menos conocido. Entiendo el problema que planteas, pero …
¿Cúal sería en tu opinión la mejor manera de utilizar NHibernate con Sql Server? La verdad es que Identity es francamente útil, estoy haciendo pruebas con S#arp Architecture y parece que funciona bien….
¿Qué me recomiendas?
gracias de antemano.
#2 by Dario Quintana on April 6th, 2009
Hola Fernando,
Dale una leida esto:
http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx
Por sobre todo, donde dice: ORM Style Generators
#3 by Fernando on April 8th, 2009
Gracias por la información Dario, muy útil.
Seguiremos probando NHibernate. Cada vez nos gusta más.
#4 by Gabriel Bravo on April 27th, 2009
estoy trabajando en un proyecto con NHibernate 2.0 y SQL Server 2008…..
es posible hacer un merge (para insertar y actualizar) y rescatar el SCOPE_IDENTITY()?….
ahora, los identificadores son identity…..
#5 by Luciano on October 19th, 2009
Inicie un proyecto con .net 2008, nhibernate 2.0 y sqlserver 2008 de “64 bits”. Esto funcionaba ok hasta que instale el
Microsoft SQL Server Management Studio 2008 y luego de un rato de trabajar normalmente empezaron a aparecer problemas con el dialecto. Estamos usando “NHibernate.Dialect.MsSql2000Dialect”, tambien probamos con
<!–NHibernate.Dialect.SQLServerDialect
–>
Necesitamos saber con que dialecto tenemos que trabajar y como sería la cadena de coneccion en el hibernate.cfg.xml. Muchas gracias.
#6 by Luciano on October 22nd, 2009