2011-10-23 14 views
0

私はnullable FK制約を持つテーブルマッピングを持っています。私の流暢なマッピングでは、私はそうのようなものをやっている:流暢NHibernate Insert Null FK

public enum PlayerPosition 
{ 
     None = 0, 
     Forward = 1 
//etc 
} 

エンティティ

public virtual PlayerPosition? Position { get; set; } 

Map(x => x.Position).Column("PlayerPositionId").CustomType< PlayerPosition>(); 

をPlayerPositionが「なし」のNHibernateはヌルを挿入するように設定されている場合で何が起こるしたいと思います。私はそれをどうやって作るのか分かりません。

+2

だから、* null'なので 'の2つの*表現、' PlayerPosition.None'または実際の 'null'なのでいずれかの値を持つようにしたいですか?どうして?格納された 'null'値が逆に意味するものは、' PlayerPosition'プロパティを 'None'または' null'に初期化する必要があるということですか?よりシンプルで洗練されたソリューションは、実際にデータベースにあるものに列挙し、マッピングレイヤー(すなわち、NHibernateエンティティとドメインモデルまたはプレゼンテーションモデルの間のマッピングレイヤー)内の任意の奇妙なマッピングを処理することです。私は実際にはここではFK( 'References')を見ることはありません - プロパティマッピングだけですか? – Aaronaught

+0

私はそれを参照として追加していません。私はそれをマッピングしています。はい、PlayerPosition.Noneをマップして、データベース内のnull参照にマップしたいとします。これはDBの設計やアラインメントに関する質問ではなく、問題のマッピング方法に関する質問です。いくつかのものは私のコントロール外です。 –

答えて

1

私はIUserTypeのために行くだろう:

public virtual PlayerPosition Position { get; set; } 

Map(x => x.Position).Column("PlayerPositionId").CustomType<PlayerPositionUserType>(); 

class PlayerPositionUserType : IUserType 
{ 

    public object NullSafeGet(IDBReader reader, string[] names, object owner) 
    { 
     int? positionvalue = NHibernateUtil.Int32.NullSafeGet(reader, names[0]); 
     return (positionvalue.HasValue) ? (PlayerPosition)positionvalue : PlayerPosition.None; 
    } 

    public void NullSafeSet(IDBCommand cmd, object value, int index) 
    { 
     var position = (PlayerPosition)value; 
     if (position == PlayerPosition.None) 
      NHibernateUtil.Int32.NullSafeSet(cmd, null, index); 
     else 
      NHibernateUtil.Int32.NullSafeSet(cmd, (int)position, index); 
    } 

    public Type ReturnType 
    { 
     get { return typeof(PlayerPosition); } 
    } 

    public SqlType[] SqlTypes 
    { 
     get { return new [] { SqlTypeFactory.Int32 } } 
    } 
}