9

Voici les classes du modèle de domaine:cartographie NHibernate avec une hiérarchie de classes dont la classe de base est abstraite et le discriminateur est pas une chaîne

public abstract class BaseClass 
{ 
... 
} 

public class ChildClass : BaseClass 
{ 
... 
} 

Notez que la classe parente est abstraite et ce qui me donne des difficultés quand vient le temps de cartographier avec nhibernate fluide. Mon discriminateur est un octet (tinyint dans la DB). Parce que ce n'est pas une chaîne et je ne peux pas gérer pour définir une valeur discriminante sur la classe de base, cela ne fonctionne pas (extrait de la classe de mapping pour BaseClass):

DiscriminateSubClassesOnColumn<byte>("Type") 
    .SubClass<ChildClass>() 
    .IsIdentifiedBy((byte)OperationType.Plan) 
    .MapSubClassColumns(p => { ... }) 

Le message d'erreur que je reçois est:

Méthode d'initialisation de classe UnitTest1.MyClassInitialize a levé l'exception. NHibernate.MappingException: NHibernate.MappingException: Impossible de formater la valeur du discriminateur en chaîne SQL de l'entité BaseClass ---> System.FormatException: la chaîne d'entrée n'était pas dans un format correct.

La publication suivante semble expliquer ce qui se passe. Ils donnent une solution avec xml mais pas avec nhibernate fluent: http://forum.hibernate.org/viewtopic.php?t=974225

Merci pour l'aide.

+0

Merci d'avoir lié à la solution avec XML - exactement ce dont j'avais besoin! –

Répondre

12

J'ai trouvé une solution mais cela semble si comme un patch ... Je ajouté ce qui suit au fichier de mappage:

SetAttribute("discriminator-value", "-1"); 

Il semble indiquer FNH de ne pas utiliser une chaîne (je pense qu'il utilise le nom de la classe) pour la classe de base abstraite. Pour le faire fonctionner avec la valeur -1, j'ai également changé mon type de discriminateur de byte à sbyte.

Edit: m'a échappé: c'est le deuxième paramètre à DiscriminateSubClassesOnColumn qui prend la valeur par défaut. Donc, la bonne réponse à ma question est:

DiscriminateSubClassesOnColumn<sbyte>("Type", (sbyte)-1) 
+0

Merci beaucoup - j'avais un problème similaire avec le discriminateur n'étant pas une chaîne. – Ted