2012-04-04 63 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