Свободное владение nHibernate и JoinSubClasses

Я не уверен, что это проблема с моей конфигурацией Fluent или какая-то логика в моем мышлении.

По сути, у меня есть класс Person, от которого я унаследовал два класса: Author и Borrower (это библиотечная система). Отображение у меня есть.

public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Id(x => x.Id, "id");
        Map(x => x.Name, "name");

        // Subclasses
        AddPart(new AuthorMap());
        AddPart(new BorrowerMap());
    }
}

public class AuthorMap : JoinedSubClassPart<Author>
{
    public AuthorMap() : base("person_id")
    {
        Map(x => x.Country, "country");
        HasMany(x => x.Books).Cascade.All().WithKeyColumn("book_id"); 
    }
}

public class BorrowerMap : JoinedSubClassPart<Borrower>
{
    public BorrowerMap() : base("person_id")
    {
        Map(x => x.UserName, "user_name");
        HasMany(x => x.Schedule).Cascade.SaveUpdate().WithKeyColumn("borrower_id");
    }
}

Теперь, если я запущу HQL «FROM Author a ORDER BY a.Name», он вернет список всех объектов Author и Borrower, где я, очевидно, просто хочу список авторов. Пожалуйста, не стесняйтесь указать мне прямо на это.


person Craig    schedule 12.03.2009    source источник


Ответы (1)


Несколько вещей, чтобы попробовать:

  • В каждой из карт подкласса задайте имя таблицы с помощью WithTableName("Author")
  • Является ли person_id ключевым столбцом в каждой таблице подклассов? Если нет, измените base("person_id") на base("key column name")

Например, я только что протестировал очень похожий запрос со следующими сопоставлениями:

public class DigitalFreeSubscriptionMap : JoinedSubClassPart<DigitalFreeSubscription>
{
    public DigitalFreeSubscriptionMap()
        : base("DigitalFreeSubscriptions")
    {
        WithTableName("DigitalFreeSubscriptions");
        ...

и

public class FreeSubscriptionMap : JoinedSubClassPart<FreeSubscription>
{
    public FreeSubscriptionMap()
        : base("FreeSubscriptions")
    {
        WithTableName("FreeSubscriptions");
        ...

Оба являются подклассами Subscription. В базе данных, которую я тестировал, есть 1700 цифровых бесплатных подписок, в то время как бесплатных подписок (и других видов подписок) более миллиона. Запрос HQL "FROM DigitalFreeSubscripion" возвратил 1700 результатов.

По запросу верхняя часть SubscriptionMap:

public class SubscriptionMap : AuditableClassMap<Subscription>
{
    public SubscriptionMap()
    {
        WithTable("Subscriptions");
        Id(x => x.Id, "Subscriptions");

        AddPart(new FreeSubscriptionMap());
        AddPart(new DigitalFreeSubscriptionMap());
        // More sublass mappings and then the field mappings
person Stuart Childs    schedule 12.03.2009