Nhibernate и индексированное представление - PullRequest
0 голосов
/ 30 ноября 2011

У меня есть Album сущность, в которой есть IList<Photo>.Я хочу выбрать все мои альбомы с количеством фотографий одним быстрым запросом с помощью NHibernate.Перед миграцией в NH у меня был запрос с использованием индексированного представления:

SELECT a.*, t.PhotoCount
FROM dbo.Album a
LEFT JOIN dbo.vw_AlbumPhotoCount t ON t.AlbumID = a.AlbumID

Как я могу использовать это представление (vw_AlbumPhotoCount) в NHibernate для ускорения запроса?

ОБНОВЛЕНИЕ: Я отобразил простую <one-to-one/> сущность, как советовал Алекс, и она сработала для меня.Один недостаток этого решения - поскольку one-to-one свойства не могут быть загружены лениво, я всегда получаю LEFT JOIN при получении альбома по id.Я не мог сопоставить эту сущность как <many-to-one/> свойство, я не уверен, почему, может быть, потому что представление не имеет своего собственного свойства ID.В любом случае, часто отображая его как <many-to-one/> Я получил нулевое значение после загрузки альбома

ОБНОВЛЕНИЕ 2: Я пересмотрел свою архитектуру и решил удалить представление.Лучший способ в этой конкретной ситуации - использовать систему кэширования NH вместо индексированного представления

Ответы [ 2 ]

0 голосов
/ 01 декабря 2011

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

0 голосов
/ 30 ноября 2011

Свойство в альбоме с формулой

// Fluent Mapping
Map(x => x.PhotoCount).Formula("SELECT t.PhotoCount FROM dbo.vw_AlbumPhotoCount t ON t.AlbumID = AlbumID");

// xml mapping
<property name="PhotoCount" formula="SELECT t.PhotoCount FROM dbo.vw_AlbumPhotoCount t ON t.AlbumID = AlbumID">

var albums = session.QueryOver<Album>().List();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...