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.

 

6 Responses to Bug con SCOPE_IDENTITY() en Sql Server 2005/2008

  1. Fernnado says:

    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. 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. Fernando says:

    Gracias por la información Dario, muy útil.
    Seguiremos probando NHibernate. Cada vez nos gusta más.

  4. Gabriel Bravo says:

    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. Luciano says:

    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. Luciano says:

    Luciano :Inicie un proyecto con .net 2008, nhibernate 2.0 y sqlserver 2008 de “64 bits”. Esto funcionaba ok hasta que instale elMicrosoft 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.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>