NHibernate - Comment faire la carte pour une classe qui n'a pas de table (pour les requêtes sql personnalisées)
Mise à jour - Édité config pour des raisons de lisibilité
dans la
Salut,
J'ai été en apprentissage NHibernate pour un jour ou deux, mais de rester bloqué sur un point.
J'ai besoin d'être en mesure d'exécuter des procédures stockées personnalisées et l'utilisation NHibernate à la carte en arrière de classes du domaine.
J'ai ce travail pour le scénario où la requête personnalisée de cartes de retour à un objet qui correspond à une table de base de données, comme illustré par de très nombreux nhibernate exemple (Voir la première section ci-dessous).
Cependant dans la config de la seconde section ci-dessous, la requête tire seulement 2 colonnes de la table cible. Pour cette raison, j'ai créé un objet personnalisé, de sorte que NHibernate a quelque chose pour mapper les valeurs de retour. La coutume des propriétés de l'objet ont le même nom que le retour des colonnes de la procédure personnalisée.
Quand je lance mes tests, j'obtiens une exception comme:
NHibernate.MappingException: Aucun
persister pour:
Proj.DataEntityTracker.Domaine.Les entités.CustomObject
Donc je suppose que la cartographie sous sql-section requête n'est pas assez pour NHibernate pour mapper les valeurs de retour pour les propriétés de l'objet.
Donc ma question est - comment puis-je configurer un mappage pour lesquels il n'existe pas d'équivalent de la table dans la base de données que j'ai la carte les résultats d'une procédure stockée à cet objet?
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-cartographie-2.2" assembly="Proj.DataEntityTracker.Le domaine" namespace="Proj.DataEntityTracker.Domaine.Les entités"> <class name="TrackedEntityProperty" table="TrackedEntityProperties"> <id name="ID" type="Int32" unsaved-value="0"> <generator class="native"></générateur> </id> <property name="TrackedEntityID" /> <property name="Nom" /> <property name="CreatedDate" /> <property name="ChangedDate" /> <property name="Type" /> <property name="CurrentValue" /> <property name="RequestPropertyValueQuestion" /> <property name="NullResponseIsAcceptable" /> <property name="Duplication" /> <property name="Fréquence" /> <property name="est actif" /> <property name="IsDeleted" /> <property name="LastUpdateTaskGenerated" /> <property name="LastUpdateTaskCompleted" /> <property name="LastUpdateTaskCancelled" /> </classe> <sql-query name="usp_GetTrackedEntityPropertiesDueforupdate" > <return alias="usp_GetTrackedEntityPropertiesDueforupdate" class="TrackedEntityProperty"> <le retour-property name="ID" column="ID" /> <le retour-property name="TrackedEntityID" column="TrackedEntityID" /> <le retour-property name="Name" column="Nom" /> <le retour-property name="CreatedDate" column="CreatedDate" /> <le retour-property name="ChangedDate" column="ChangedDate" /> <le retour-property name="Type de données" column="DataType" /> <le retour-property name="CurrentValue" column="CurrentValue" /> <le retour-property name="RequestPropertyValueQuestion" column="RequestPropertyValueQuestion" /> <le retour-property name="NullResponseIsAcceptable" column="NullResponseIsAcceptable" /> <le retour-property name="Duplication" column="Duplication" /> <le retour-property name="Fréquence" column="Fréquence" /> <le retour-property name="est actif" column="est actif" /> <le retour-property name="IsDeleted" column="IsDeleted" /> <le retour-property name="LastUpdateTaskGenerated" column="LastUpdateTaskGenerated" /> <le retour-property name="LastUpdateTaskCompleted" column="LastUpdateTaskCompleted" /> <le retour-property name="LastUpdateTaskCancelled" column="LastUpdateTaskCancelled" /> </retour> exec usp_GetTrackedEntityPropertiesDueforupdate :TrackedEntityID </sql-query> <sql-query name="usp_SomeCustomSproc"> <return alias="usp_SomeCustomSproc" class="CustomObject"> <le retour-property name="ID" column="ID" /> <le retour-property name="Name" column="Nom" /> </retour> exec usp_SomeCustomSproc :TrackedEntityID </sql-query> </hibernate-mapping>
Vous devez vous connecter pour publier un commentaire.
Ce que vous cherchez, sont des projections. Tout d'abord, vous devez modifier votre requête
Ensuite dans le code où vous l'appelez, il vous spécifiez un résultat transformateur. Le AliasToBeanTransformer prendra les alias de colonne et de les mapper les propriétés sur l'objet.
Problème résolu, bien qu'il semble évident que NHibernate ne veut pas que vous l'utilisation de procédures stockées. Je suis ce détachement pour aider les autres avec la même question, car cette information n'a pas été facile à trouver!
Initiale blog qui a aidé avec ce qui était ici, bien que cet exemple cartographié le résultat dans un objet standard - table de mapping (qui peut être ce que vous voulez). Je voulais une carte le résultat dans un objet personnalisé qui n'ont pas de table de la représentation dans la base de données:
http://forums.asp.net/t/1407518.aspx/1
Donc, j'ai créé un domaine en classe afin de conserver les résultats d'une procédure stockée.
Cette classe n'a pas besoin d'avoir une table dans SQL server, même si j'ai trouvé que la définition d'une classe ne doivent être créées (sans attribut de table) afin d'éviter “NHibernate.MappingException: Pas de persister pour:” des erreurs de type.
Note également que le domaine de la classe qui est créé pour contenir les résultats d'une procédure stockée a besoin d'un champ ID, et ce doit être retourné à partir de la base de données. Dans ce cas, je suis retourné NEWID() de SQL Server et configuré le mappage de classe pour utiliser le générateur de GUID pour le champ ID.
Et le mappage de classe: