FluentNhibernate多对多和反向()

时间:2012-04-04 18:05:02

标签: nhibernate fluent-nhibernate many-to-many override

我定义了以下数据库表:

Club:Id,Name

成员:Id,姓名

ClubMember:ClubId,MemberId

我定义了以下实体类:

    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上的Inverse意味着您无法执行以下操作

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

但这有效:

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

但它没有逻辑意义。我希望能够将会员或会员与俱乐部一起保存。

我是否尝试使用FluentNhibernate做一些不可能的事情?

TIA

2 个答案:

答案 0 :(得分:3)

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

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

来自官方文件:

  

仅对关联的反向结束所做的更改不会保留。这意味着NHibernate在内存中有两个表示形式,用于每个双向关联,一个链接从A到B,另一个链接从B到A.如果你考虑.NET对象模型以及我们如何创建一个多对象,这将更容易理解。 - C#中的很多关系:

答案 1 :(得分: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);
    }
}