NHibernate 3.2 много для любого отображения по коду и наследованию - PullRequest
1 голос
/ 06 марта 2012

У меня есть сопоставление много-к-любому и конфликт наследования при попытке сопоставить мой домен следующим образом:

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 { }

Я сопоставляю наследование вот так:

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");

    }
}

Теперь я хочу отобразить отношения IssuedToken (много) и Member (любое), но я не знаю, как это сделать!Можете ли вы помочь мне, пожалуйста, понять и отобразить отношение?

ПРИМЕЧАНИЕ: Я использую NHibernate 3.2 отображение по коду - Не API NHibernateFluent, ни XML .

1 Ответ

1 голос
/ 06 марта 2012

попробовать:

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));
            }));
    }
}

и

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);
        }); 
    } 
}
...