Mert
Mert

Reputation: 6572

Fluent NHibernate Many To Many on Same Table

How can I create relation like this?

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.UserId);
        Map(x => x.UserName);
        Map(x => x.Password);
        Map(x => x.FirstName);
        Map(x => x.LastName);
        HasManyToMany(x => x.FBFriends).Cascade.All().Table("UserFBFriend");
        HasManyToMany(x => x.FBFriends).Cascade.All().Inverse().Table("UserFBFriend");
    }
}

public class User : BaseClass<User>
{
    public virtual int UserId { get; set; }
    public virtual string UserName { get; set; }
    public virtual string Password { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }

    public virtual IList<User> FBFriends { get; set; }

    public User()
    {
        FBFriends = new List<User>();
    }

    public virtual void AddUserFBFriend(User user)
    {
        user.FBFriends.Add(this);
        FBFriends.Add(user);
    }
}

UPDATE

    HasManyToMany(x => x.LeftFBFriends).Cascade.All().Table("UserFBFriend");
    HasManyToMany(x => x.RightFBFriends).Cascade.All().Inverse().Table("UserFBFriend");

    public virtual IList<User> LeftFBFriends { get; set; }
    public virtual IList<User> RightFBFriends { get; set; }
    public User()
    {
        LeftFBFriends = new List<User>();
        RightFBFriends = new List<User>();
    }

Upvotes: 1

Views: 629

Answers (1)

Radim K&#246;hler
Radim K&#246;hler

Reputation: 123851

As discussed, we need two collections, representing both directions A-B, B-A

public virtual IList<User> LeftFBFriends { get; set; }
public virtual IList<User> RightFBFriends { get; set; }

And we'd need explicit column mapping:

HasManyToMany(x => x.LeftFBFriends)
    .Table("UserFBFriend")
    .ParentKeyColumn("LeftColumn")
    .ChildKeyColumn("RightColumn")
    .Cascade.All().Table("UserFBFriend");

HasManyToMany(x => x.RightFBFriends)
    .Table("UserFBFriend")
    .ParentKeyColumn("RightColumn")
    .ChildKeyColumn("LeftColumn")
    .Cascade.All()
    .Inverse()

So, this way we do correctly instruct NHibernate, which column will play parent (this ID) and which will be the child (collection ID). We have to do that for both collections

Upvotes: 4

Related Questions