Kevin Pang
Kevin Pang

Reputation: 41442

Fluent NHibernate question

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?

Upvotes: 8

Views: 1766

Answers (4)

Chris Marisic
Chris Marisic

Reputation: 33128

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

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

Upvotes: 4

Reddy
Reddy

Reputation:

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

Upvotes: 0

James Gregory
James Gregory

Reputation: 14223

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

Upvotes: 13

lomaxx
lomaxx

Reputation: 115863

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

Upvotes: 0

Related Questions