Actualización - Editado config para facilitar la lectura en SONHibernate - ¿Cómo asignar a una clase que no tiene ninguna mesa (para consultas SQL personalizado)
Hola,
He estado aprendiendo NHibernate por un día o dos pero quedando atrapado en un punto.
Necesito ser capaz de ejecutar procedimientos almacenados personalizados y utilizar NHibernate para asignarlos de nuevo a clases de dominio.
Esto funciona para el escenario donde la consulta personalizada se correlaciona con un objeto que se asigna a una tabla de base de datos, como se muestra en muchos ejemplos de nhibernate (consulte la primera sección a continuación).
Sin embargo, en la configuración de la segunda sección a continuación, la consulta extrae solo 2 columnas de la tabla de destino. Por esta razón, he creado un objeto personalizado para que NHibernate tenga algo para mapear los valores de retorno. Las propiedades de objeto personalizado tienen el mismo nombre que las columnas de retorno del procedimiento personalizado.
Cuando ejecuto mis pruebas me sale una excepción como:
NHibernate.MappingException: No persister para: Proj.DataEntityTracker.Domain.Entities.CustomObject
así que supongo que la la asignación en la sección sql-query no es suficiente para que NHibernate correlacione los valores devueltos con las propiedades del objeto.
Así que mi pregunta es: ¿cómo puedo configurar una asignación para la que no hay una tabla equivalente en la base de datos para poder asignar los resultados de un procedimiento almacenado a ese objeto?
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Proj.DataEntityTracker.Domain" namespace="Proj.DataEntityTracker.Domain.Entities"> <class name="TrackedEntityProperty" table="TrackedEntityProperties"> <id name="ID" type="Int32" unsaved-value="0"> <generator class="native"></generator> </id> <property name="TrackedEntityID" /> <property name="Name" /> <property name="CreatedDate" /> <property name="ChangedDate" /> <property name="DataType" /> <property name="CurrentValue" /> <property name="RequestPropertyValueQuestion" /> <property name="NullResponseIsAcceptable" /> <property name="Duplication" /> <property name="Frequency" /> <property name="IsActive" /> <property name="IsDeleted" /> <property name="LastUpdateTaskGenerated" /> <property name="LastUpdateTaskCompleted" /> <property name="LastUpdateTaskCancelled" /> </class> <sql-query name="usp_GetTrackedEntityPropertiesDueForUpdate" > <return alias="usp_GetTrackedEntityPropertiesDueForUpdate" class="TrackedEntityProperty"> <return-property name="ID" column="ID" /> <return-property name="TrackedEntityID" column="TrackedEntityID" /> <return-property name="Name" column="Name" /> <return-property name="CreatedDate" column="CreatedDate" /> <return-property name="ChangedDate" column="ChangedDate" /> <return-property name="DataType" column="DataType" /> <return-property name="CurrentValue" column="CurrentValue" /> <return-property name="RequestPropertyValueQuestion" column="RequestPropertyValueQuestion" /> <return-property name="NullResponseIsAcceptable" column="NullResponseIsAcceptable" /> <return-property name="Duplication" column="Duplication" /> <return-property name="Frequency" column="Frequency" /> <return-property name="IsActive" column="IsActive" /> <return-property name="IsDeleted" column="IsDeleted" /> <return-property name="LastUpdateTaskGenerated" column="LastUpdateTaskGenerated" /> <return-property name="LastUpdateTaskCompleted" column="LastUpdateTaskCompleted" /> <return-property name="LastUpdateTaskCancelled" column="LastUpdateTaskCancelled" /> </return> exec usp_GetTrackedEntityPropertiesDueForUpdate :TrackedEntityID </sql-query> <sql-query name="usp_SomeCustomSproc"> <return alias="usp_SomeCustomSproc" class="CustomObject"> <return-property name="ID" column="ID" /> <return-property name="Name" column="Name" /> </return> exec usp_SomeCustomSproc :TrackedEntityID </sql-query> </hibernate-mapping>
Gracias, esto es realmente útil – gb2d