2011-10-23 45 views
0

我有一个表空间映射可空的FK约束。在我流利的映射,我做的事情,像这样:流利的NHibernate插入空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',无论是'PlayerPosition.None'或实际'null'值的表示?为什么?那么存储的'null'值是什么意思呢,那么这是否意味着'PlayerPosition'属性应该被初始化为'None'或'null'?看起来更简单/清洁的解决方案是将枚举与数据库中的实际对齐,并处理映射层(即NHibernate实体和域或表示模型之间的映射层)中的任何奇怪的映射。我也没有在这里看到FK('References') - 只是一个属性映射? – Aaronaught

+0

我不加入它作为参考我只是映射它。是的,我想映射PlayerPosition.None映射到数据库中的空引用。这不是关于数据库设计或对齐的问题,而是关于如何映射问题的问题。有些东西不在我的控制之下。 –

回答

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