2010-02-11 15 views
5

Estoy usando Fluent NHibernate en una aplicación Asp.net MVC. Lo tengo configurado para iniciar una sesión y una transacción en cada solicitud, y confirmar la transacción al final de la solicitud. Sin embargo, lo que quiero hacer es guardar un objeto (en este caso, una nueva "Compañía") y luego redireccionar a la nueva página de detalles de la empresa. ¿Cómo obtengo el Id de la nueva compañía para que pueda redireccionar? Si obtengo el ID después de la sesión. Guardar (compañía), es nulo. Esto tiene sentido, ya que aún no se ha comprometido, sin embargo, todavía parece que debería haber una manera relativamente fácil de hacerlo sin comprometer la transacción actual y comenzar una nueva.Fluido NHibernate obtener ID del objeto guardado

+1

Debería poder obtener la identificación después de haber llamado a session.save. ¿Qué tipo de identificación estás usando? –

+0

¿Cuál es la instrucción o código que usa para obtener el nuevo valor de ID de fila? Estoy guardando filas en una tabla con un campo de identidad, pero comenzando con nHibernate. Recuerdos –

+0

Es solo object.Id o lo que sea que se llame su campo de id. –

Respuesta

2

Bien, el problema estaba en otra parte de mi código. Puede obtener el Id inmediatamente después de guardar, incluso si no ha realizado la transacción o no la ha enjuagado.

Gracias a todos por las respuestas, pero lamentablemente ninguno de ellos es del todo correcto.

0

¿Quizás no está configurado como autogenerado en la base de datos? Como dijo Mattias Jakobsson, la identificación debería configurarse después de Session.Save

0

Dado que es una transacción, NHibernate pospone los cambios y, por lo tanto, INSERT no se envía a la base de datos, y la base de datos no genera ninguna ID. Haga Session.Flush(): esto no detendrá la transacción, pero sus cambios (INSERT) se ejecutarán. O use ID asignados. O no siempre inicie transacciones: haga esto explícitamente (como por ejemplo S # arp Architecture lo hace con el atributo [Transaction]).

0

Creo que es una mala idea iniciar una transacción para cada sesión. Estoy usando session-per-request y comienzo y confirmo una transacción en Session_EndRequest. Sin embargo, generalmente tengo una transacción en la página para que pueda manejar cualquier error que se produzca allí: cuando EndRequest se produce es demasiado tarde para hacer algo más que presentar un mensaje de error genérico.

Si está utilizando identificadores generados (identidad) de la base de datos, tendrá que enjuagar la sesión para generar la ID.

+0

Debe usar una transacción para cada sesión, incluso para leer. De lo contrario, no utilizará por completo el caché; consulte: http://ayende.com/Blog/archive/2008/12/28/nh-prof-alerts-use-of-implicit-transactions-is-discouraged.aspx. – UpTheCreek

+0

Acepto, a menos que se refiera a una transacción por sesión. Mi respuesta podría haber sido más clara, pero estaba argumentando en contra de permitir que la duración de la transacción sea igual a la duración de la solicitud. No es un problema tener múltiples transacciones por sesión. –

7

NHibernate genera una identificación cuando session.Save() o session.SaveOrUpdate() se llama con una entidad transitoria. En este momento, la propiedad id de la entidad está configurada y puede ser utilizada.

Si el generador de id necesita acceso a la base de datos, sucederá en este momento. Entonces, para el generador de Identidad, la inserción se realizará en este momento al igual que cualquier inserción pendiente.

De lo contrario, el inserto está pendiente hasta que la sesión se vacía el que va a pasar:

  • de algunas invocaciones de Búsqueda() o Enumerable()
  • de NHibernate.ITransaction.Commit()
  • de ISession.Flush()
Cuestiones relacionadas