NHibernate: загрузка только объектов базового класса

Любая помощь приветствуется. Даже если вы можете сказать (основываясь на своем опыте), что использование ORM для такой огромной иерархии безумие :).

Backgroud Мой уровень модели имеет довольно большую иерархию классов, то есть около 200 классов. Хорошая / плохая вещь в иерархии состоит в том, что все они имеют одинаковый базовый класс. Максимальное расстояние между базовым и конечным классами равно 7, а максимальное число классов на любом уровне иерархии равно 80. Я использую nHibernate для сохранения / загрузки данных из постоянного хранилища.

проблема Запросы, сгенерированные nHibernate, довольно эффективны. например, если я хочу выбрать идентификаторы объектов на основе какого-либо фильтра для свойства в базовом классе, NHibernate попытается объединить все таблицы в иерархии / объединить их в зависимости от того, какую стратегию отображения я выбираю, т.е. таблицу для подкласса или таблицу для класса иерархия.

Я понимаю, что nHibernate не делает, какой тип объекта, пока он не может сканировать все соответствующие таблицы. Но что, если меня сейчас интересуют только данные базового класса? Как заставить nHibernate загружать только объекты базового класса.

Чтобы проиллюстрировать мою проблему, вот упрощенная версия

public class Vehicle
{
    public virtual Guid Identifier { get; set; }
    public virtual int WheelsCount { get; set; }
    public virtual Make Make { get; set; }
    public virtual Model Model { get; set; }
}

public class Bike : Vehicle
{
    public Bike()
    {
        WheelsCount = 2;
    }

    public virtual bool IsDirtBike { get; set; }
}

public class Car : Vehicle
{
    public Car()
    {
        WheelsCount = 4;
    }

    public virtual bool IsFourWheelDrive { get; set; }

    public virtual string Title { get; set; }
    public virtual string Description { get; set; }
}

public class Make
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Model> Models { get; set; }
}

public class Model
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual Make Make { get; set; }
}

И отображения следующие

public class VehicleMap : ClassMap<Vehicle>
{
    public VehicleMap()
    {
        Id(x => x.Identifier).GeneratedBy.Guid();
        Map(x => x.WheelsCount);

        References(x => x.Make).Column("MakeId");
        References(x => x.Model).Column("ModelId");

        Table("Vehicle");
        Polymorphism.Explicit();
        UseUnionSubclassForInheritanceMapping();
    }
}

public class BikeMap : SubclassMap<Bike>
{
    public BikeMap()
    {
        Map(x => x.IsDirtBike);
        Table("Bike");
        // Abstract();
    }
}

public class CarMap : SubclassMap<Car>
{
    public CarMap()
    {
        Map(x => x.Title);
        Map(x => x.Description);
        Map(x => x.IsFourWheelDrive);
        Table("Car");
       // Abstract();
    }
}

public class MakeMap : ClassMap<Make>
{
    public MakeMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        HasMany(x => x.Models)
            .KeyColumn("MakeId");
        Table("Make");
    }
}

public class ModelMap : ClassMap<Model>
{
   public ModelMap()
   {
       Id(x => x.Id);
       Map(x => x.Name);
       References(x => x.Make)
           .Column("MakeId");
       Table("Model");
   }
}

Теперь, если выполнить следующий запрос для загрузки четырехколесных транспортных средств, NHibernate присоединится к транспортным средствам, автомобилям и велосипедному столу. В то время как все, что мне сейчас нужно, это только данные, хранящиеся в таблице транспортных средств.

List<Vehicle> vehicles = session.Query < Vehicle > ().Where(v => v.WheelsCount > 2).ToList();

Кто-нибудь знает, как я могу заставить nHibernate просто загрузить данные, которые нужны в данный момент, т.е. если он может возвращать только объекты транспортных средств вместо Car / Bike? Имея всего пару таблиц в вашей схеме, вы можете пропустить эти запросы с помощью nHibernate, но это действительно больно, когда у вас есть 200 таблиц :(.

Постскриптум В случае неисправности модели, пожалуйста, игнорируйте это. Это не настоящая модель. Фактическая модель, как указано ранее, намного больше. Эта модель предназначена для иллюстрации проблемы.

Ответы на вопрос(1)

Ваш ответ на вопрос