2009-03-03 4 views
1

Quel est le meilleur moyen d'obtenir le comportement inverse du type booléen YesNo dans le mappage NHibernate?NHibernate DataTypes - NoYes Boolean

Je veux que 'Y' signifie faux et 'N' signifie vrai.

Existe-t-il un type NoYes? Est-ce que vous écrivez un type personnalisé? quelque chose de vraiment facile?

Cette question de devoir inverser le booléen existe sur au moins un champ sur plus de 40 tables. Essayer de s'adapter à une base de données existante.

+2

Si « oui » signifie « non », alors ce doit être la base de données de l'héritage de l'enfer. –

+0

Juste quelques conventions étranges (environ 7). Et c'est l'un d'entre eux. Pas l'enfer, mais peut-être le purgatoire. – BuddyJoe

Répondre

5

J'ai trouvé que traiter des formats de données bizarres dans les bases de données existantes peut être facilement réalisé en mettant en œuvre des types personnalisés. Par exemple, j'ai récemment créé un type d'utilisateur simple pour mapper DateTime à 8 chiffres sur le formulaire yyyyMMdd, qui correspondait à la façon dont les dates étaient stockées dans une sauvegarde DB2 que je devais utiliser. Les techniciens ont un exemple sur l'implémentation IUserType que vous pouvez utiliser pour résoudre votre problème: Mapping Strings to Booleans Using NHibernate's IUserType.

1

J'ai eu un problème similaire. La solution la plus facile que j'ai trouvée était d'étendre le CharBooelanType de NHibernate et d'utiliser le nouveau type sur le mapping. Ce serait comme ça:

using NHibernate.Type; 
using NHibernate.SqlTypes; 

namespace MyAssembly.MyNamespace 
{ 
    public class NewBoolType : CharBooleanType 
    { 
     public NewBoolType() 
      : base(new AnsiStringFixedLengthSqlType(1)) { } 

     protected override string TrueString 
     { 
      get { return "N"; } 
     } 

     protected override string FalseString 
     { 
      get { return "Y"; } 
     } 

     public override string Name 
     { 
      get { return "inverted_bool"; } 
     } 
    } 
} 

Et la cartographie serait comme ça:

<property name="MyProperty" column="MyColumn" type="MyAssembly.MyNamespace.NewBoolType, MyAssembly" /> 
Questions connexes