Foros del Web » Programación para mayores de 30 ;) » .NET »

Id no autogenerado con NHibernate

Estas en el tema de Id no autogenerado con NHibernate en el foro de .NET en Foros del Web. Buenos días! Esa es una de mis primeras experiencias en foros, por eso les pido disculpas si no logro darme a entender correctamente. La cuestión ...
  #1 (permalink)  
Antiguo 21/09/2012, 06:28
 
Fecha de Ingreso: septiembre-2012
Ubicación: Santa Fe
Mensajes: 2
Antigüedad: 11 años, 7 meses
Puntos: 0
Id no autogenerado con NHibernate

Buenos días!

Esa es una de mis primeras experiencias en foros, por eso les pido disculpas si no logro darme a entender correctamente. La cuestión por la que me comunico con ustedes es la siguiente:

Estoy desarrollando un programa en .NET y utilizo para persistencia de datos el mapeador objeto-relacional NHibernate. Hasta ahora no había tenido problemas porque todos los id de las tablas eran autoincrementales. Ahora me encuentro en la necesidad de crear entidades cuyo id es un código que se especifica desde la aplicación. Es decir, necesito que NHibernate persista el objeto con el id que yo le indico en la aplicación y que no me lo autogenere. Por lo que creo, el problema está en el archivo de mapping. Hasta ahora lo tengo definido de la siguiente manera:

<class name="Sueldos.Entidades.Legajo, Sueldos" table="Legajo" lazy="false">
<id name="Id" column="id">
<generator class="native" />
</id>
<property name="Apellido" column="apellido" />
<property name="Nombre" column="nombre" />
<property name="TipoDoc" column="tipoDoc" />
<property name="NroDoc" column="nroDoc" />
<property name="FechaNac" column="fechaNac" />
<property name="Domicilio" column="domicilio" />
<property name="Localidad" column="localidad" />
<property name="CodPostal" column="codPostal" />
<property name="FechaIngreso" column="fechaIngreso" />
<property name="FechaVirtual" column="fechaVirtual" />
<property name="Telefono" column="telefono" />
<property name="CantHoras" column="cantHoras" />
<property name="FormaLiquidacion" column="formaLiquidacion" />
<property name="Cuil" column="cuil" />
<property name="Cbu" column="cbu" />
<property name="EstadoCivil" column="estadoCivil" />
<many-to-one name="Categoria"
column="idCategoria"
not-null="true"/>
<many-to-one name="Departamento"
column="idDepartamento"
not-null="true"/>
<many-to-one name="Seccion"
column="idSeccion"
not-null="true"/>
<many-to-one name="CentroCosto"
column="idCentroCosto"
not-null="true"/>
<many-to-one name="ObraSocial"
column="idObraSocial"
not-null="true"/>
<property name="Eliminado" column="eliminado" />
</class>

Me parece que el problema está en la etiqueta generator, pero no se cómo solucionarlo.

Desde ya muchas gracias

Saludos!
  #2 (permalink)  
Antiguo 21/09/2012, 08:06
 
Fecha de Ingreso: junio-2012
Mensajes: 90
Antigüedad: 11 años, 10 meses
Puntos: 2
Respuesta: Id no autogenerado con NHibernate

Una función para auto incrementar el id de una tabla? Quizá estoy entendiendo mal, pero pues aquí esta una función para que incrementes el id.

Código Visual Basic .NET:
Ver original
  1. Public Function MaxId() As Integer
  2.         Dim sql As String = "SELECT ISNULL (MAX("id column"),0)" & _
  3.                             "FROM "nombre_table""
  4.         Using cnn As New SqlConnection(cs)
  5.             Dim cmd As New SqlCommand(sql, cnn)
  6.             cnn.Open()
  7.             Dim n As Integer = Convert.ToInt32(cmd.ExecuteScalar())
  8.             Return n
  9.         End Using
  10.     End Function

Y la mandas llamar asi:

Código C:
Ver original
  1. Dim NextID As Integer = MaxId() + 1

Espero pueda ayudarte y si no es así disculpa entendí mal xD
  #3 (permalink)  
Antiguo 21/09/2012, 09:17
 
Fecha de Ingreso: septiembre-2012
Ubicación: Santa Fe
Mensajes: 2
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Id no autogenerado con NHibernate

3ricks0ul:

muchas gracias por la respuesta! en realidad no me soluciona el problema del comentario, pero me viene bien para otro caso que tengo pendiente . Gracias por tu predisposición y por la pronta respuesta.

Encontré la solución al problema, así que la dejo por las dudas a alguien se le presente algo similar:

El código del archivo mapping corregido es el siguiente:

<!-- clase Legajo -->
<class name="Sueldos.Entidades.Legajo, Sueldos" table="Legajo" lazy="false">
<id name="Id" type="int" column="id"></id>
<property name="Apellido" column="apellido" />
<property name="Nombre" column="nombre" />
<property name="TipoDoc" column="tipoDoc" />
<property name="NroDoc" column="nroDoc" />
<property name="FechaNac" column="fechaNac" />
<property name="Domicilio" column="domicilio" />
<property name="Localidad" column="localidad" />
<property name="CodPostal" column="codPostal" />
<property name="FechaIngreso" column="fechaIngreso" />
<property name="FechaVirtual" column="fechaVirtual" />
<property name="Telefono" column="telefono" />
<property name="CantHoras" column="cantHoras" />
<property name="FormaLiquidacion" column="formaLiquidacion" />
<property name="Cuil" column="cuil" />
<property name="Cbu" column="cbu" />
<property name="EstadoCivil" column="estadoCivil" />
<many-to-one name="Categoria"
column="idCategoria"
not-null="true"/>
<many-to-one name="Departamento"
column="idDepartamento"
not-null="true"/>
<many-to-one name="Seccion"
column="idSeccion"
not-null="true"/>
<many-to-one name="CentroCosto"
column="idCentroCosto"
not-null="true"/>
<many-to-one name="ObraSocial"
column="idObraSocial"
not-null="true"/>
<property name="Eliminado" column="eliminado" />
</class>


Además, para que NHibernate utilice la clave primaria que se especifica como atributo de la entidad (y no genere uno automáticamente), utilicé la sentencia SaveOrUpdate. El código en C#:

/// <summary>
/// Saves the or update.
/// </summary>
/// <param name="entity">The entity.</param>
public void SaveOrUpdate(Legajo entity)
{
ISession.SaveOrUpdate(entity);
ISession.Flush();
}


Espero le sea de utilidad a alguien .

Saludos

Etiquetas: net, nhibernate, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:51.