2015-08-10 1 views
0

J'ai une classe qui contient une collection de valeurs structurées comme un dictionnaire avec des clés en tant que chaîne et chaque élément une liste de chaînes.Comment est-ce que je peux mapper un dictionnaire de chaîne et IList <string> dans le nhibernate courant?

Comment puis-je mapper ceci en tant que table séparée sans avoir à définir une classe supplémentaire?

J'ai essayé le code suivant, mais je n'arrive pas à le faire fonctionner.

Classe

public class User 
{ 
    property virtual Guid Id {get; set; } 
    property IDictionary<string, List<string>> Rights; 
} 

Mapping

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
    Id(p => p.Id).GeneratedBy.Guid(); 
    HasMany(p => p.Rights). 
       Table("Rights"). 
       KeyColumn("Key"). 
       Element("Right"). 
       AsMap<string>("Rights"); 

Actuellement, je suis dans l'obscurité fumbeling comment je peux obtenir ce travail. Il semble facile de mapper un dictionnaire < chaîne, chaîne> mais peut-être impossible de mapper un dictionnaire < chaîne, Liste < chaîne >> de cette façon?

Répondre

0

Une option serait de tricher un peu et d'utiliser un champ de support qui utilise toujours le IDictionary<string, string>, mais l'expose comme IDictionary<string, List<string>>.

public class User 
{ 
    public virtual Guid Id { get; set; } 

    // Map this one 
    protected internal virtual IDictionary<string, string> RightsInternal { get; set; } 

    // Use this one 
    public virtual IDictionary<string, List<string>> Rights 
    { 
     get { return RightsInternal.ToDictionary(_ => _.Key, _ => _.Value.Split('|').ToList()); } 
     set { RightsInternal = value.ToDictionary(_ => _.Key, _ => string.Join("|", _.Value)); } 
    } 
} 

Assurez-vous que mapper Id et RightsInternal (vous pouvez mapper protected internal propriétés avec NHibernate comme expliqué here).

La solution propre serait d'étendre cette association à OneToMany relations ou aller encore plus loin et d'utiliser une base de données NoSQL qui fournissent un excellent support pour le stockage de valeur-clé. En outre, consultez this post.