Можно ли с готовностью загрузить внешний природный ключ с помощью NHibernate? - PullRequest
0 голосов
/ 06 августа 2011

Например, скажем, у меня есть две таблицы, Product и Order. Продукт имеет ID, Name, Description, Cost и другие подробные столбцы. В заказе есть столбцы ID и ProductID (предполагается, что заказ может содержать только один продукт).

При отображении списка заказов в системе я хотел бы также отобразить имя связанного продукта без всех других данных (т. Е. Быстро загрузить заказ и имя связанного с ним продукта и лениво загрузить весь другой продукт свойства):

SELECT o.ID, o.ProductID, p.Name FROM Order o JOIN Product p ON o.ProductID=p.ID

Если я делаю это с NHibernate, у меня есть два варианта: полная загрузка или отложенная загрузка.

При энергичной загрузке я получаю что-то вроде:

SELECT o.ID, o.ProductID, p.ID, p.Name, p.Description, p.Cost, p.... FROM Order JOIN Product p ON o.ProductID=p.ID

При ленивой загрузке я получаю что-то вроде:

SELECT o.ID, o.Product ID from Order
....
SELECT p.Name, p.Description, p.Cost, p.... FROM Product p WHERE p.ID=?

Обновление

Вот более конкретный пример того, чего я пытаюсь достичь. Я работаю с существующим DAL и пытаюсь интегрировать NHibernate. Одной из функций текущего DAL является то, что он позволяет получать некоторую базовую информацию о внешнем ключе как часть родительской записи. Допустим, есть таблица User и таблица Region. У каждого пользователя есть внешний ключ к региону, в котором он находится. При отображении информации о пользователе в графическом интерфейсе имя региона должно отображаться вместе с пользователем, но другие сведения о регионе не нужны.

В текущем DAL доменный объект User имеет член типа ForeignKeyReference<Region>.

public class ForeignKeyReference<T>
{
    public virtual int ForeignKeyID { get; set; }
    public virtual string ForeignNaturalKey { get; set; }
    public virtual T Reference { get; set; }
}

Когда User извлекается из базы данных, первичные и естественные ключи для Region также извлекаются, а Reference устанавливается в качестве прокси-объекта. Я хотел бы упростить это с NHibernate, но по-прежнему поддерживать эту функциональность. Например, я хотел бы удалить член ForeignKeyReference<Region> и просто иметь член Region, который является прокси-сервером NHibernate. На этом прокси я хотел бы иметь возможность получить идентификатор и имя без необходимости повторного обращения к базе данных.

1 Ответ

0 голосов
/ 07 августа 2011

Вы можете пометить определенный столбец как ленивый.Айенде написал об этой новой функции в прошлом году.

Я бы посоветовал вам прочитать документацию Hibernate об этой функции, однако:

Hibernate3 поддерживает отложенную выборку отдельных свойств.Этот метод оптимизации также известен как выборочные группы.Обратите внимание, что это в основном маркетинговая функция;оптимизация чтения строк намного важнее, чем оптимизация чтения столбцов.Тем не менее, только загрузка некоторых свойств класса может быть полезна в крайних случаях.Например, когда у устаревших таблиц есть сотни столбцов, и модель данных не может быть улучшена.

Другой альтернативой является создание собственных запросов:

Session.CreateQuery

Посмотрите наэто ответ .

...