2009-03-03 12 views
1

Was ist der beste Weg, um das umgekehrte Verhalten des YesNo Boolean Typ in NHibernate Mapping zu bekommen?NHibernate DataTypes - NoYes Boolean

Ich möchte "Y" falsch und "N" für wahr bedeuten.

Gibt es einen NoYes-Typ? Schreibst du einen benutzerdefinierten Typ? etwas wirklich einfaches?

Das Problem, den Boolean umzukehren, ist in mindestens einem Feld in mehr als 40 Tabellen vorhanden. Der Versuch, sich an eine ältere Datenbank anzupassen.

+2

Wenn „Ja“ bedeutet „nein“, dann ist dieses Vermächtnis Datenbank aus der Hölle sein muss. –

+0

Nur ein paar seltsame Konventionen (etwa 7). Und das ist einer von ihnen. Nicht die Hölle, aber vielleicht Fegefeuer. – BuddyJoe

Antwort

5

Ich habe festgestellt, dass der Umgang mit seltsamen Datenformate in älteren Datenbanken leicht durch die Implementierung von benutzerdefinierten Typen erreicht werden kann. Zum Beispiel habe ich kürzlich einen einfachen Benutzertyp erstellt, um DateTime auf 8-stellige Zahlen im Formular yyyyMMdd abzubilden, was zufällig der Art war, wie die Daten in einem DB2-Dump gespeichert wurden, den ich verwenden musste.

Los Techies haben ein Beispiel zur Implementierung IUserType, die Sie verwenden können, um Ihr Problem zu lösen: Mapping Strings to Booleans Using NHibernate's IUserType.

1

Ich hatte ein ähnliches Problem. Die einfachere Lösung, die ich fand, war, den CharBooelanType von NHibernate zu erweitern und den neuen Typ für das Mapping zu verwenden. Es würde so sein:

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"; } 
     } 
    } 
} 

Und die Abbildung so sein würde:

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