2008-11-26 5 views
2

J'ai une base de données héritée que je suis en train de mapper avec Nhibernate. Et dans plusieurs emplacements, une liste och strig ou des objets de domaine sont mappés en tant que chaîne délimitée dans la base de données. Soit 'string | string | string' dans les cas de type valeur et comme 'domainID | domainID | domainID' dans les cas de type références. Je sais que je peux créer une propriété fictive sur la classe et mapper à ces champs, mais je voudrais le faire d'une manière plus propre, comme lorsque mappage Enums comme leur représentation sous forme de chaîne avec la classe EnumStringType.Nhibernate ValueType Collection en tant que chaîne délimitée dans DB

Est-ce qu'un IUserType est le chemin à parcourir?

Merci à l'avance /Johan

Répondre

5

J'utilise ce:

public class DelimitedList : IUserType 
{ 
    private const string delimiter = "|"; 

    public new bool Equals(object x, object y) 
    { 
     return object.Equals(x, y); 
    } 

    public int GetHashCode(object x) 
    { 
     return x.GetHashCode(); 
    } 

    public object NullSafeGet(IDataReader rs, string[] names, object owner) 
    { 
     var r = rs[names[0]]; 
     return r == DBNull.Value 
      ? new List<string>() 
      : ((string)r).SplitAndTrim(new [] { delimiter }); 
    } 

    public void NullSafeSet(IDbCommand cmd, object value, int index) 
    { 
     object paramVal = DBNull.Value; 
     if (value != null) 
     { 
      paramVal = ((IEnumerable<string>)value).Join(delimiter); 
     } 
     var parameter = (IDataParameter)cmd.Parameters[index]; 
     parameter.Value = paramVal; 
    } 

    public object DeepCopy(object value) 
    { 
     return value; 
    } 

    public object Replace(object original, object target, object owner) 
    { 
     return original; 
    } 

    public object Assemble(object cached, object owner) 
    { 
     return cached; 
    } 

    public object Disassemble(object value) 
    { 
     return value; 
    } 

    public SqlType[] SqlTypes 
    { 
     get { return new SqlType[] { new StringSqlType() }; } 
    } 

    public Type ReturnedType 
    { 
     get { return typeof(IList<string>); } 
    } 

    public bool IsMutable 
    { 
     get { return false; } 
    } 
} 

SplitAndTrim est ma propre extension de chaîne. Puis dans la classe (en utilisant ActiveRecord pour le mappage):

[Property(ColumnType = "My.Common.Repository.UserTypes.DelimitedList, My.Common.Repository")] 
public virtual IList<string> FooBar { get; set; } 
Questions connexes