Search code examples
nhibernateinheritancenhibernate-3nhibernate-mapping-by-code

NHibernate 3.2 many to any mapping by code and inheritance


I have a many-to-any mapping and an inheritance conflict when trying to map my domain like this:

public class Member {
    public virtual int Id { get; set; }
    // many:
    public virtual IList<IssuedToken> IssuedTokens { get; set; }
}

public abstract class IssuedToken {
    public virtual int Id { get; set; }
    // any:
    public virtual Member Member { get; set; }
}

public class IssuedRequestToken : IssuedToken { }

public class IssuedAccessToken : IssuedToken { }

I map the inheritance like this:

public class IssuedTokenMap : ClassMapping<IssuedToken> {
    public IssuedTokenMap() {
        Discriminator(t => {
            t.Force(true);
            t.Insert(true);
            t.Length(32);
            t.NotNullable(true);
            t.Type(NHibernateUtil.String);
            t.Column("Discriminator");
        });
    }
}

public class IssuedAccessTokenMap : SubclassMapping<IssuedAccessToken> {
    public IssuedAccessTokenMap() {
        DiscriminatorValue("IssuedAccessToken");
    }
}

public class IssuedRequestTokenMap : SubclassMapping<IssuedRequestToken> {
    public IssuedRequestTokenMap() {
        DiscriminatorValue("IssuedRequestToken");

    }
}

Now I want to map the IssuedToken(many) and Member(any) relation, but I don't know how to do it! can you help me please to understand and map the relation?

NOTE: I'm using NHibernate 3.2 mapping by code -Not NHibernateFluent API, nor XML.


Solution

  • try:

    public class MemberMap : ClassMapping<Member> {
        public MemberMap() {
    
            // add a bag -or set.
            Bag(t => t.IssuedTokens,
                bag => {
                    bag.Inverse(true);
                    bag.Key(k => k.Column(col => col.Name("MemberId")));
                },
                c => c.ManyToAny<int>(m => {
                    m.Columns(id => {
                        id.Name("MemberId");
                        id.NotNullable(true);
                    }, cls => {
                        cls.Name("Discriminator");
                        cls.NotNullable(true);
                    });
                    m.IdType<int>();
                    m.MetaType<string>();
                    m.MetaValue("IssuedAccessToken", typeof(IssuedAccessToken));
                    m.MetaValue("IssuedRequestToken", typeof(IssuedRequestToken));
                }));
        }
    }
    

    and:

    public class IssuedTokenMap : ClassMapping<IssuedToken> { 
        public IssuedTokenMap() { 
            Discriminator(t => { 
                t.Force(true); 
                t.Insert(true); 
                t.Length(32); 
                t.NotNullable(true); 
                t.Type(NHibernateUtil.String); 
                t.Column("Discriminator"); 
            });
    
            // add a many-to-one
            ManyToOne(t => t.Member, t => {
                t.Column("MemberId");
                t.NotNullable(true);
            }); 
        } 
    }