Получение сопоставленных сущностей из ISQLQuery без AddEntity
Рассмотрим эти POCO:
class Foo {
int Id {get;set;}
string Name {get;set;}
}
class Bar {
int Id {get;set;}
string PropA {get;set;}
Foo PropB {get;set;}
}
Теперь, чего я хочу достичь, это с помощью ISQLQuery
с корневой сущностью Bar
также гидратировать свойство PropB.
ISQLQuery barsAround = nhSes.CreateSQLQuery("select b.Id, b.PropA, {????} from Bar b inner join Foo f on f.Id = b.FK_FooId");
barsAround.SetResultTransformer(Transformers.AliasToBean<Bar>());
IList<Bar> results = barsAround.List<Bar>();
где в {????} есть фрагмент, который выбирает b.Id и b.Name и гидратирует свойство PropB сущности Bar.
Я не могу использовать ISQLQuery.AddEntity()
потому что это приводит к управляемым объектам, и я не могу использовать управляемые объекты. Полученные столбцы являются версиями столбцов, поэтому один и тот же идентификатор для каждой строки убивает движок NHibernate.
1 ответ
Вы можете написать свой собственный специальный преобразователь. Это не сложно, посмотрите на источник AliasToBeanResultTransformer
,
Лучшей альтернативой является написание объектной модели, которая фактически отражает вашу БД и домен. Если существует несколько версий Bar, тогда номер версии (или любой другой, используемый для его идентификации) должен быть частью ключа.
Таким образом вы избавитесь от всех хаков.