NHibernate - неправильное мышление? Подклассовая модель на основе соединения - PullRequest
0 голосов
/ 21 мая 2009

У меня есть простой класс модели (Part), который извлекает информацию из одной таблицы (t_Part).

Я бы хотел подкласс этой модели, называемый (ProducedPart), который по-прежнему будет использовать механизмы кэширования NHibernate, но будет только экземплярами (Part), которые имеют отношение внешнего ключа в таблице с именем "t_PartProduction". Мне не нужно , чтобы иметь модель для этой второй таблицы.

Мне нужна только версия ProducedPart только для чтения

Я всегда мог реализовать Facade / Repository поверх этого, но я надеялся настроить отображение, которое будет тянуть «t_Part» вместе с «PartProduction», когда я запрашивал «ProducedPart» в NH.

Это неправильный способ использования NH?

Редактировать

Итак, SQL будет выглядеть примерно так:

SELECT p.* 
FROM t_Part p 
INNER JOIN t_PartProduction pp ON pp.PartID = p.PartID 
WHERE pp.ProductionYear = '2009'

Ответы [ 3 ]

1 голос
/ 21 мая 2009

Я считаю, что вы ищете, это объединенный подкласс. В FNH это будет выглядеть примерно так:

public class PartMap : ClassMap<Part>
{
    public PartMap()
    {
        Id(x => x.Id)

        JoinedSubClass<ProducedPart>("PartID", sub => { 
            sub.Map(x => x.Name); 
            sub.Map(x => x.ProductionYear); 
        });
    }
}

Для того, чтобы NHibernate кешировал результаты, вам нужно будет отобразить подкласс (и если вы не отобразите его, вы не сможете получить NH для его загрузки).

В некотором контексте из потока групп FNH он явно не будет доступен только для чтения. По моему мнению, создание вещей только для чтения не является подходящей вещью для NHibernate. Это лучше контролируется базой данных и соединениями (т. Е. Создается соединение с базой данных, которое имеет только разрешения SELECT для таблиц / представлений, к которым осуществляется доступ). См. мой ответ на предыдущий вопрос SO о сеансах только для чтения в NHibernate для получения дополнительной информации по этому вопросу.

1 голос
/ 21 мая 2009

Ключ здесь использует элементы where и mutable определения class для сопоставлений NHibernate.

Использование Fluent NHibernate выглядит следующим образом:

    public Part()
    {
        WithTable("t_Part");

        Id(i => i.Id).ColumnName("PartID");
        Map(m => m.Name).ColumnName("Part");

        SetAttribute("where", "PartID IN ( SELECT pp.PartID FROM t_PartProduction pp WHERE pp.ProductionYear = '2009' ) ");

        ReadOnly();
    }
1 голос
/ 21 мая 2009

Нет, это вполне возможно. Посмотрите в документации NHibernate модель наследования "таблица на подкласс". Фактически он реализует это как LEFT JOIN, поэтому при загрузке части он создает экземпляр вашей части или класса ProducedPart в зависимости от наличия другой строки. Вы найдете документацию по nhibernate.info .

Я не уверен, что вы можете сделать ProducedPart доступным только для чтения, делая это.

Я предполагаю из этого:

WHERE pp.ProductionYear = '2009'

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

...