3

次のデータベース テーブルが定義されています。

クラブ: ID、名前

メンバー: 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 で不可能なことをしようとしていますか?

ティア

4

2 に答える 2

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 に答える
3

はい、そうです、それは不可能です。しかし、それは FluentNhibernate の問題ではありません。NHibernate はそのように動作します。

一方だけがリレーションの所有者であり、要素の追加を担当します。

公式ドキュメントから:

関連付けの逆側のみに加えられた変更は保持されません。これは、NHibernate が双方向の関連付けごとにメモリ内に 2 つの表現 (A から B への 1 つのリンクと B から A への別のリンク) を持つことを意味します。これは、.NET オブジェクト モデルと多対オブジェクトの作成方法について考えると理解しやすくなります。 -C# の多くの関係:

于 2012-04-04T18:20:35.407 に答える