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
source to share
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 #:
source to share
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);
}
}
source to share