8
votes

Let's say you have two tables, "Users" and "UserRoles". Here's how the two tables are structured (table - columns):

Users - UserID (int)

UserRoles - UserID (int), Role (string)

What I want is for my "User" class in my domain to have an IList of roles. How do I construct my Fluent NHibernate mapping to achieve this?

4

4 Answers

13
votes

What you're looking for is a of a set of elements, which in standard hbm mapping is:

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

For Fluent NHibernate you can map this like so:

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

You may need to also specify the key name using WithKeyColumn(string).

4
votes

FWIW this has change minorly of present day. The current mapping is

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

I beleive it would be

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

You'll also have to make sure you map your UserRoles class as well

0
votes

This also worked:

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

You don't need to map Role or UserRoles.

Make sure Role implements IEquatable < Role > ;.