3

我定义了以下数据库表:

俱乐部:身份证、姓名

成员: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

4

2 回答 2

3

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

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

来自官方文档:

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

于 2012-04-04T18:20:35.407 回答
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);
    }
}
于 2012-04-05T11:54:02.293 回答