Domanda

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.

È stato utile?

Soluzione

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);
        }); 
    } 
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top