2009-04-06 10 views
1

J'ai la propriété suivante sur une classe avec NHibernate persisté:Est-il possible que NHibernate génère automatiquement une propriété à partir de l'ID?

public virtual string Code 
{ 
    get { return Id.ToString("SP000"); } 
} 

Cependant, je suis venu à ce faire, ce qui bien sûr ne fonctionne pas:

Session.Linq<MyType>().Where(x => x.Code.Contains(searchTerm)); 

Alors, est-il possible pour stocker le code dans la base de données et avoir NHibernate gérer le

.ToString("SP000") 

pour définir le code, lorsque l'ID est défini? Edit: Je suppose que j'ai besoin d'un intercepteur, mais je ne suis pas sûr de savoir comment mettre en œuvre ce dont j'ai besoin. Toute aide appréciée

Merci

Andrew

Répondre

1

Permettez-moi de reformuler la question pour vous assurer que je le comprends: Vous avez une clé primaire entier mis en correspondance avec la propriété Id mais que vous souhaitez interroger sur la propriété Code qui est une chaîne en lecture seule. Si vous aviez des enregistrements avec le code "SP123" et "SP234", la requête retournerait les deux enregistrements pour searchTerm "2".

Essayez d'utiliser HQL (Hibernate Query Language) au lieu de Linq pour cette requête. Vous pouvez utiliser les fonctions SQL dans HQL, de sorte que votre requête ressemblerait à quelque chose comme:

"from Table t where 'SP' + CAST(Id AS varchar) LIKE '%" + searchTerm + "%'"; 

Vous voulez réécrire que pour utiliser un paramètre pour que ce n'est pas vulnérable aux attaques par injection SQL.

+0

Merci pour la suggestion mais je ne peux pas utiliser HQL parce que j'ai des motifs d'abstraction encapsulant l'ISession derrière une interface IQueryable donc je dois utiliser LINQ. Je ne veux pas non plus que des chaînes magiques (la HQL) flottent à peu près. Je ne me soucie pas d'avoir Code dans la DB, je ne cherche pas à l'éviter, il suffit de l'implémenter –

+1

OK. Créez une vue qui contient la colonne de code et mappez-la en tant que propriété en lecture seule dans votre objet en mappant la vue à la place de la table. –

0

Mappez le code en tant que propriété readonly dans votre hbm, vous pouvez alors effectuer une recherche de la manière que vous préférez! Comme effet secondaire de la mutation de l'identificateur, vous devriez également envisager d'y ajouter une contrainte unique et définir la propriété update = false.

Amitiés

Questions connexes