Получение сопоставленных сущностей из ISQLQuery без AddEntity - PullRequest
0 голосов
/ 23 июля 2010

рассмотрим эти 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 Ответ

2 голосов
/ 23 июля 2010

Вы можете написать свой собственный специальный преобразователь. Это не сложно, посмотрите на источник AliasToBeanResultTransformer.

Лучшей альтернативой является написание объектной модели, которая фактически отражает вашу БД и домен. Если существует несколько версий Bar, тогда номер версии (или любой другой, используемый для его идентификации) должен быть частью ключа.

Таким образом вы избавитесь от всех хаков.

...