views:

744

answers:

4

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?

A: 

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

lomaxx
The thing is UserRoles isn't a class. It's just a list of strings. The datatable isn't linking two foreign keys, just one foreign key (UserID) and a role name (string).
Kevin Pang
+10  A: 

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).

James Gregory
A: 

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 > ;.

+1  A: 

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

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