FluentNhibernate many-to-many and Inverse ()

I have the following database tables:

Club: ID, Name

Member: Id, Name

ClubMember: ClubId, MemberId

I have the following entity. Specific classes:

    public class Club() {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual IList<Member> Members { get; set; }
    }

    public class Member() {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual IList<Club> Clubs { get; set; }
    }

      

I have the following overrides:

    public class MemberOverride : IAutoMappingOverride<Member>
    {
        public void Override(AutoMapping<Member> mapping_)
        {
            mapping_
                .HasManyToMany(x_ => x_.Clubs)
                .ParentKeyColumn("MemberId")
                .ChildKeyColumn("ClubId")
                .Cascade.All()
                .Table("ClubMembers");
        }
    }

    public class ClubOverride : IAutoMappingOverride<Club>
    {
        public void Override(AutoMapping<Club> mapping_)
        {
            mapping_
                .HasManyToMany(x_ => x_.Members)
                .ParentKeyColumn("ClubId")
                .ChildKeyColumn("MemberId")
                .Inverse()
                .Table("ClubMembers");
        }
    }

      

It can be seen from my overrides that the inversion on ClubOverride means you cannot do the following

    session.Save(club.Members.Add(member));

      

but this works:

    session.Save(member.Clubs.Add(club);

      

But this is not logical. I want to be able to keep a club with members or a member of the club.

Am I trying to do something impossible with FluentNhibernate?

TIA

+3


source to share


2 answers


Yes, you are right, it is impossible. But this is not a FluentNhibernate question, NHibernate works like this.

Only one side owns the relationship and is charged by adding items.



From the official documentation:

Changes made only to the opposite end of the association are not saved. This means NHibernate has two in-memory views for each bidirectional association, one reference from A to B and another reference from B to A. This is easier to understand if you think about the .NET object model and how we create multi-user - multiple relationships in C #:

+3


source


You can create or remove methods on your objects to help you accomplish this:



public class Club() {
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    private IList<Member> members;
    public virtual IEnumerable<Member> Members { get { return members.Select(x => x); } }

    public Club() {
        members = new List<Member>();
    }

    public virtual void AddMember(Member member){
        if (members.Contains(member))
            return;

        members.Add(user);
        member.AddClub(this);
    }

    public virtual void RemoveMember(Member member){
        if (!members.Contains(member))
            return;

        members.Remove(member);
        member.RemoveClub(this);
    }
}

      

+3


source







All Articles