2009-01-11 11 views
8

Disons que vous avez deux tables, "Utilisateurs" et "UserRoles". Voici comment les deux tables sont structurées (tableau - colonnes):Fluent NHibernate question

Utilisateurs - UserID (int)

UserRoles - ID utilisateur (int), Rôle (string)

Ce que je veux pour mon « utilisateur "classer dans mon domaine pour avoir un IList de rôles. Comment puis-je construire ma cartographie Fluent NHibernate pour y parvenir?

Répondre

13

Qu'est-ce que vous cherchez est un ensemble d'éléments qui dans la cartographie standard HBM:

<set name="Roles" table="UserRoles"> 
    <key column="UserID" /> 
    <element column="Role" /> 
</set> 

Pour Fluent NHibernate vous pouvez mapper cette façon:

HasMany<string>(x => x.Roles) 
    .AsElement("Role"); 

Vous devrez peut-être également spécifier le nom de clé en utilisant WithKeyColumn(string).

0

Je beleive ce serait

public User() 
    { 
    Id(x => x.UserID); 
    HasMany<UserRoles>(x => x.UserRoles).AsBag(); 
    } 

Vous devez également vous assurer que vous associez votre classe UserRoles ainsi

+0

La chose est UserRoles n'est pas une classe. C'est juste une liste de chaînes. La donnée ne lie pas deux clés étrangères, juste une clé étrangère (UserID) et un nom de rôle (chaîne). –

0

Cela a également travaillé:

HasMany<Role>(u => u.Roles) 
       .WithTableName("UserRoles") 
       .Component(role => role.Map(r => r.Name)) 
       .AsList(); 

Vous n'avez pas besoin de carte de rôle ou UserRoles.

Assurez-vous que le rôle implémente IEquatable <Role> ;.

4

FWIW cela a changé minorly de nos jours. Le mappage actuel est

HasMany<string>(x => x.Roles) 
    .Element("Role");