Абстрактный класс и NHibernate - PullRequest
2 голосов
/ 02 июля 2011

У меня есть класс:

class abstract Car {
    ...
}

class ConcreteCar {
    ...
}

class AnotherConcreteCar {
    ...
}

Тем не менее, кажется очень запутанным, как отображать их в NHibernate. Мне нужно иметь возможность собрать:

List<Car> cars;
for (Car car in cars) {
    ...
}

Я также хотел бы использовать генератор (что является альтернативой?) Для генерации следующего carID. Есть join-subclass, который запрещает это, и, честно говоря, все это сбивает меня с толку. Кажется, мне придется вернуться к тому, чтобы сделать Car интерфейсом, а это не совсем то, чего я хочу.

Кроме того, независимо от того, какой метод я использую (скажем, я просто делаю Car суперклассом и другими подклассами), если я запрашиваю базу данных:

* * 1010

Придется ли мне типизировать объекты в их типы подкласса, чтобы использовать свойства и методы подкласса? Будет ли это работать? Действительно ли NHibernate вычисляет подкласс и создает объекты подкласса, или он просто создает объекты суперкласса, которые не могут быть преобразованы в их подклассы?

Ответы [ 3 ]

1 голос
/ 02 июля 2011

Я уже реализовывал такой подход, но помню, что он работал в моем конкретном случае.

Я предполагаю, что Car - это базовая таблица с некоторыми общими столбцами, если это так, то вы можете отобразить свои сущности следующим образом (я использую Fluent NHibernate):

CarMap:

public class CarMap : ClassMap<Car> { ... }

ConcreteCarMap:

public class ConcreteCarMap : SubclassMap<ConcreteCar>
{
    public ConcreteCarMap()
    {
        Extends<CarMap>();

        // other properties
        // Map(x => x.Property).Not.Nullable();
    }
}

Имея это, вы можете выполнить свой запрос:

from item in session.Query<Car>() select item;

И действительно, вам нужно будет типизировать возвращаемые объекты в их типы подклассов, чтобы получить доступ к свойствам и методам подкласса, но NHibernate будет достаточно intelligent, чтобы создать их правильно для вас.

NHibernate достигнет этого, используя такой синтаксис (псевдо sql):

select

-- all columns from Car
-- all columns from ConcreteCar 
-- other columns from subclasses

case 
    when f1.SubId is not null then 1
    when f2.SubId is not null then 2
    when f3.SubId is not null then 3
    when f4.SubId is not null then 4
    when f5.SubId is not null then 5
    when f0.Id is not null then 0
end as type

from Car f0
left outer join ConcreteCar f1 on f0.Id = f1.SubId
-- other joins

Таким образом, в зависимости от фактического количества реализованных подклассов это может повлиять на производительность.

Надеюсь, это ответит на ваш вопрос.

0 голосов
/ 02 июля 2011

Да, это работает!

Это мой код:

public abstract class Vote:EntityBase

public class VoteComment:Vote,IVote

public class VotePhoto:Vote,IVote


internal List<Vote> Test()
{
   return session.Query<Vote>().ToList();
}

и вот результат:

enter image description here

0 голосов
/ 02 июля 2011

это вполне возможно.
см. отображение наследования .
Вы можете использовать session.Query<Car>, и nHib узнает, что нужно создать объекты соответствующего подкласса.
дайте мне знать, если у вас естьеще есть вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...