Mostrando entradas con la etiqueta NHibernate. Mostrar todas las entradas
Mostrando entradas con la etiqueta NHibernate. Mostrar todas las entradas

domingo, 9 de noviembre de 2008

could not resolve property: Id_Per

En NHibernate lo que manda a grandes rasgos es el maping y si ocurre este error es probable que la propiedad por la que ocurre el error no esta en el mapping, por ejemplo:

En el archivo con error falta la propiedad Id_Per.

Archivo con error:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="crmos.Bo.Contacto, crmos.Bo" table="Contacto">
<id name="Id_Con" type="Int32" unsaved-value="null">
<column name="Id_Con" length="4" sql-type="int" not-null="true" unique="true" index="PK_Contacto"/>
<generator class="native" />
</id>
<property name="Id_Cti" type="Int32">
<column name="Id_Cti" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Fecha_Con" type="DateTime" access="property" >
<column name="Fecha_Con" sql-type="datetime" />
</property>
<property name="Observacion_Con" type="String" access="property">
<column name="Observacion_Con" length="16" sql-type="text" not-null="false"/>
</property>
<property name="Estado_Est" type="Int32" access="property">
<column name="Estado_Est" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Id_Ven" type="Int32" access="property">
<column name="Id_Ven" length="4" sql-type="int" not-null="false"/>
</property>

</class>
</hibernate-mapping>

Archivo correcto
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="crmos.Bo.Contacto, crmos.Bo" table="Contacto">
<id name="Id_Con" type="Int32" unsaved-value="null">
<column name="Id_Con" length="4" sql-type="int" not-null="true" unique="true" index="PK_Contacto"/>
<generator class="native" />
</id>
<property name="Id_Per" type="Int32">
<column name="Id_Per" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Id_Cti" type="Int32">
<column name="Id_Cti" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Fecha_Con" type="DateTime" access="property" >
<column name="Fecha_Con" sql-type="datetime" />
</property>
<property name="Observacion_Con" type="String" access="property">
<column name="Observacion_Con" length="16" sql-type="text" not-null="false"/>
</property>
<property name="Estado_Est" type="Int32" access="property">
<column name="Estado_Est" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Id_Ven" type="Int32" access="property">
<column name="Id_Ven" length="4" sql-type="int" not-null="false"/>
</property>

</class>
</hibernate-mapping>

Could not find field 'Fecha_Con' in class 'crmos.Bo.Contacto'

Tube este error en el proyecto CRMOS y solucione cambiando  la propiedad access de field a property.

Código con error:
&lt:property name="Fecha_Con" type="DateTime" access="field" >
<column name="Fecha_Con" sql-type="datetime" />
</property>

Corregido
&lt:property name="Fecha_Con" type="DateTime" access="field" >
<column name="Fecha_Con" sql-type="datetime" />
</property>

Could not find a getter for property

Estube con este error n días hasta que descubrí cual era la razón. ¿De que estamos hablando? Del proyecto CRMOS con NHibernate. Tengo una clase que es Contacto:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="crmos.Bo.Contacto, crmos.Bo" table="Contacto">
<id name="Id" type="Int32" unsaved-value="null">
<column name="Id_Con" length="4" sql-type="int" not-null="true" unique="true" index="PK_Contacto"/>
<generator class="native" />
</id>
<property name="Id_Cti" type="Int32">
<column name="Id_Cti" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Fecha_Con" type="DateTime" access="field" >
<column name="Fecha_Con" length="8" sql-type="datetime" not-null="false"/>
</property>
<property name="Observacion_Con" type="String" access="field">
<column name="Observacion_Con" length="16" sql-type="text" not-null="false"/>
</property>
<property name="Estado_Est" type="Int32" access="field">
<column name="Estado_Est" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Id_Ven" type="Int32" access="field">
<column name="Id_Ven" length="4" sql-type="int" not-null="false"/>
</property>
    
</class>
</hibernate-mapping>

y la clase que estaba implementando tenia campos como:
xId_Con, xId_Cti, etc. Ejemplo:

public virtual int xId_Con{ 
 get {return Id_Con;} set {Id_Con=value;}}

 public virtual int xId_Per{ 
 get {return xId_Per;} set {xId_Per=value;}}
 public virtual int Id_Cti{ 
 get {return Id_Cti;} set {Id_Cti=value;}}
 public virtual DateTime xFecha_Con{ 
 get {return Fecha_Con;} set {Fecha_Con=value;}}
 public virtual string xObservacion_Con{ 
 get {return Observacion_Con;} set {Observacion_Con=value;}}
 public virtual int xEstado_Est{ 
 get {return Estado_Est;} set {Estado_Est=value;}}
 public virtual int xId_Ven{ 
 get {return Id_Ven;} set {Id_Ven=value;}} 


La solución es que si tengo mapeada una propieda Id_Con, Id_Per, etc. Esos es lo que tiene que estar en la clase. Ejemplo (el siguiente código es correcto)

public virtual int Id_Con{ 
 get {return xId_Con;} set {xId_Con=value;}}

 public virtual int Id_Per{ 
 get {return xId_Per;} set {xId_Per=value;}}
 public virtual int Id_Cti{ 
 get {return xId_Cti;} set {xId_Cti=value;}}
 public virtual DateTime Fecha_Con{ 
 get {return xFecha_Con;} set {xFecha_Con=value;}}
 public virtual string Observacion_Con{ 
 get {return xObservacion_Con;} set {xObservacion_Con=value;}}
 public virtual int Estado_Est{ 
 get {return xEstado_Est;} set {xEstado_Est=value;}}
 public virtual int Id_Ven{ 
 get {return xId_Ven;} set {xId_Ven=value;}}

martes, 21 de octubre de 2008

in expected: p

La tarea pendiente es: Solucionar el siguiente error en el proyecto CRMOS.

in expected: p [select c.Id_Con, c.Id_Per, p.Nombres_Per , p.ApellidoPaterno_Per, c.Id_Cti, c.Fecha_Con, c.Observacion_Con, c.Estado_Est, c.Id_Ven
from crmos.Bo.Contacto c
inner join Persona p
on c.Id_Per=p.Id_Per
order by c.Id_Con desc]

Update 29/10/2008
Ahora tengo este otro error:

outer or full join must be followed by path expression [select c.Id_Con, c.Id_Per, p.Nombres_Per , p.ApellidoPaterno_Per, c.Id_Cti, c.Fecha_Con, c.Observacion_Con, c.Estado_Est, c.Id_Ven from crmos.Bo.Contacto as c inner join crmos.Bo.Persona as p on c.Id_Per=p.Id_Per order by c.Id_Con desc]

Creo que lo que provoca este error es el uso de INNER JOIN, por lo que reemplaze esta consulta que usa INNER JOIN 

select c.Id_Con, c.Id_Per, p.Nombres_Per , p.ApellidoPaterno_Per, c.Id_Cti, c.Fecha_Con, c.Observacion_Con, c.Estado_Est, c.Id_Ven 
from Contacto as c 
inner join Persona as p on c.Id_Per=p.Id_Per order by c.Id_Con desc

por esta consulta:

select c.Id_Con, c.Id_Per, p.Nombres_Per , p.ApellidoPaterno_Per, c.Id_Cti, c.Fecha_Con, c.Observacion_Con, c.Estado_Est, c.Id_Ven from Contacto as c , Persona as p where c.Id_Per=p.Id_Per order by c.Id_Con desc


sábado, 18 de octubre de 2008

NHibernate.QueryException: unexpected token:

Me estoy reconciliando con los libros y la comunidad NHibernate. De hecho estoy avanzando mas rápido en el desarrollo con este framework. Me he encontrado con algunos errores los cuales en la medida de lo posible quiero documentar (las soluciones) por que es lo mas probable que en el futuro vuelvan a ocurrir, y por supuesto le sirvan a alguien. El error: NHibernate.QueryException: unexpected token: ... , me ocurrio en el siguiente trozo de código:

public IList getContactos()
{
nhsesion cSes = new nhsesion();
ISession session = cSes.OpenSession();

IQuery query = session.CreateQuery("from Contacto as cont order by cont.Id_Con asc");
return query.List();

}

¿El error porque ocurría? Porque estaba mal configurado el namespaces en al archivo de mapeo. Y la solución por supuesto fue corregir esa situación en el archivo de mapeo que en mi caso era Contacto.hbm.xml en la linea que indica el nombre y el namespaces de la clase:

class name="crmos_consola.Contacto, crmos_consola" lazy="false"


jueves, 9 de octubre de 2008

NHibernate - La curva de aprendizaje

NHibernate (a todo esto es un software de persistencia que que independiza tu aplicación del motor de datos). Me tiene bien a mal traer, no lo puedo dominar aún.
Y hay una serie de situaciones que hacen cuesta arriba el aprendizaje. Para enumerar algunos:

Los ejemplos que se encuentran estan en una versión anterior, la cual tiene diferencias importantes con la ultima (que es la que interesa usar).
En un grupo de noticia en el cual hice una consulta me mando al foro, por newbie, donde ustedes ya saben estan los ejemplos añejos. Que recuerde el unico ejemplo que hecho funcionar ha sido uno que baje de esta página:
http://metodologiasdesistemas.blogspot.com

Y me falta hacer los descargos sobre el libro NHibernate in Action, que es una cosa insipida. ¿A quien le han encargado un sistema en linea de comandos ultimamente? Si alguien responde si, le recomiendo el libro.

Espero que llegue el minuto en que me reconcilie con el mundo NHibernate con sus libros, sus foros, grupos, comunidad, y eso de pie a un post en mi lado politicamente correcto de la web. Pero por lo pronto me desahogo en este espacio que es mi lado B.

Update 18/10/2008
A unos días de hacer mis descargos, puedo decir que ha ido mejor de hecho ya estoy trabajando con el framework. Y en todo esto me ha servido bastante el libro NHibernate in Action.