2009-10-04 6 views
2

Disons que j'ai quelque chose de similaire à ceci:Comment cartographier le type avec NHibernate (et Fluent NHibernate)

public class DataType 
{ 
    //For NHibernate 
    private DataType(){} 

    public DataType(string name, Type type, string defaultValue) 
    { 
     Name = name; 
     TypeOfContent = type; 
     DefaultInvariantStringValue = defaultValue; 
    } 

    public string Name { get; set; } 
    public Type TypeOfContent { get; set; } 
    public string DefaultInvariantStringValue { get; set; } 
} 

Comment mapper le TypeOfContent de propriété avec NHibernate (cartographie couramment serait trop apprécié)?

Je voudrais contraindre Type à C# Built-In Types par exemple. string, int, datetime, etc. Donc je voudrais stocker System.String (pour une chaîne) dans la base de données

+1

Je créerais une classe de type de données différente pour chaque type et laisser tomber la chaîne – Paco

Répondre

2

Je suis curieux, pourquoi faites-vous pas au lieu

public class DataType 
{  
    ...   
    private string _typeOfContent; 
    public virtual Type TypeOfContent 
    { 
     get { return Type.GetType(_typeOfContent); } 
     set { _typeOfContent = value.FullName; } 
    } 
} 

... 

public class DataTypeMap : ClassMap<DataType> 
{ 
    Map(x => x.TypeOfContent) 
     .Access.CamelCaseField(Prefix.Underscore) 
     .CustomType<string>(); 
} 
0

Je vais essayer de répondre à ma propre question mais j'espère qu'il y a un autre moyen (plus facile/plus propre).

Je pense que je pourrais changer le type de la propriété TypeOfContent à quelque chose comme BuiltInType (une classe wrapper Type personnalisée) afin qu'elle puisse implémenter IUserType.

Je pourrais alors utiliser cette technique: http://blog.jagregory.com/2009/01/11/fluent-nhibernate-auto-mapping-type-conventions/

Edit 1:Je n'aime pas cette solution car il me force à ajouter une dépendance (IUserType) sur NHibernate sur mon modèle.

+2

Je pense que vous vous trompez - votre modèle de domaine ne dépendrait pas de 'IUserType'. Seule votre cartographie en dépendrait. – yfeldblum

2

Je me demande si cela est overthought un peu. Ne pouvez-vous pas simplement mapper le type en tant que propriété?

public class DataTypeMap : ClassMap<DataType> 
{ 
    public DataTypeMap() 
    { 
     // ... 
     Map(x => x.TypeOfContent); 
    } 
} 

En sqlite au moins, cela correspondra à une colonne TEXT qui stockera le AssemblyQualifiedName.

Le hbm.xml pertinent est ici:

<property name="Type" type="System.Type, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
    <column name="Type" /> 
</property> 

La question supplémentaire de la façon de cartographier avec élégance la valeur par défaut est également d'intérêt pour moi. En sqlite au moins there is no 'strong-typing' of a column (j'utilise probablement la mauvaise terminologie, voir le lien) donc au niveau de la base de données au moins il devrait être possible d'avoir simplement un objet DefaultValue et persist/depersist sans perte de précision. Cependant, it remains an open question as to how to create a mapping for this that NHibernate will understand.

Questions connexes