2009-03-03 9 views
1

NHibernateマッピングでYesNoブール型の逆の動作を取得する最適な方法は何ですか?NHibernate DataTypes - NoYesブール

「Y」は偽を意味し、「N」は真実を意味します。

NoYesタイプはありますか?あなたはカスタムタイプを書いていますか?本当に簡単なこと?

ブール値を逆にする必要があるこの問題は、40を超えるテーブルの少なくとも1つのフィールドに存在します。 レガシーデータベースに対応しようとしています。

+2

「はい」、これは地獄からのレガシーデータベースでなければなりません「no」を意味します。 –

+0

ほんの奇妙な慣例(約7)。そして、これもその一つです。地獄ではないが、腐敗しているかもしれない。 – BuddyJoe

答えて

5

私は、カスタムタイプを実装することで、レガシーデータベースの奇妙なデータフォーマットを簡単に処理できることを発見しました。たとえば、私は最近DateTimeを、yyyyMMddという形式の8桁の数字にマップするシンプルなユーザー・タイプを作成しました。これは、使用しなければならなかったDB2ダンプに日付が格納された方法でした。

Los Techiesには、問題解決のために使用できるIUserTypeの実装例があります。Mapping Strings to Booleans Using NHibernate's IUserType

1

私は同様の問題がありました。 私が見つけた簡単な解決策は、NHibernateからCharBooelanTypeを拡張し、新しい型をマッピングに使用することでした。 それはそのようになります:

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

とマッピングがそのようになります:

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