2012-04-04 64 views
3

我有以下的数据库表中定义:FluentNhibernate许多一对多和逆()

俱乐部:ID,姓名

会员:ID,姓名

ClubMember:ClubId,成员Id

我有以下实体类定义:

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

我有跟随着摹覆盖定义:

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"); 
     } 
    } 

我可以从我的覆盖看到,在ClubOverride逆意味着你不能做以下

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

但这个工程:

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

但它不没有逻辑意义。我希望能够与俱乐部成员或俱乐部成员保存俱乐部。

我想用FluentNhibernate做一些不可能的事情吗?

TIA

回答

3

是的,你是对的,那是不可能的。但这不是FluentNhibernate的问题,NHibernate的工作就是这样。

只有一方是关系的所有者并负责添加元素。

从官方文档:

只发到关联的反向端的更改不会持久。这意味着NHibernate在每个双向关联的内存中有两个表示,一个从A到B的链接,另一个从B到A的链接。如果您考虑.NET对象模型以及我们如何创建多对多在C#中-many关系:

+0

清晰,简明的响应。谢谢! – 2012-04-13 08:36:39

3

您可以创建你的实体添加或删除的方法,这将有助于实现这一点:我的问题

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); 
    } 
} 
+0

感谢科尔W.这是一个很好的方式来完成我需要做NHibernate的行为。 – 2012-04-13 08:38:35