2011-10-23 11 views
0

J'ai un mappage de table avec une contrainte FK Nullable. Dans mon mapping couramment que je fais quelque chose comme ceci:Fluid NHibernate Insert Null FK

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

Entité

public virtual PlayerPosition? Position { get; set; } 

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

Ce que je voudrais arriver est quand PlayerPosition est réglé sur « None » Nhibernate insérera nulle. Je ne suis pas sûr de savoir comment y arriver.

+2

Vous voulez avoir deux représentations * * de 'null', que ce soit' PlayerPosition.None' ou 'valeur réelle null'? Pourquoi? Que signifie une valeur 'null' stockée en sens inverse, cela signifie-t-il que la propriété' PlayerPosition' devrait être initialisée à 'None' ou' null'? On dirait que la solution plus simple serait d'aligner votre énumération sur ce qui est réellement dans la base de données et de gérer tous les mappages bizarres dans la couche de mappage (c'est-à-dire la couche de mappage entre les entités NHibernate et le domaine ou le modèle de présentation). Je ne vois pas vraiment de FK ('Références') ici - juste une cartographie des propriétés? – Aaronaught

+0

Je ne l'ajoute pas comme référence Je ne fais que le mapper. Oui, je voudrais mapper PlayerPosition.None pour mapper une référence nulle dans la base de données. Ce n'est pas une question sur la conception ou l'alignement d'une base de données. Il s'agit d'une question sur la façon de cartographier un problème. Certaines choses sont hors de mon contrôle. –

Répondre

1

je pencherais pour 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 } } 
    } 
} 
Questions connexes