Кажется, что NHibernate должен иметь идентификационный тег, указанный как часть отображения. Это представляет проблему для представлений как большую часть времени (по моему опыту), представление не будет иметь идентификатора. Я отобразил представления прежде в nhibernate, но они способ, которым я сделал, это, казалось, было быть грязным мне.
Вот изобретенный пример того, как я делаю его в настоящее время.
Отображение
<class name="ProductView" table="viewProduct" mutable="false" >
<id name="Id" type="Guid" >
<generator class="guid.comb" />
</id>
<property name="Name" />
<!-- more properties -->
</class>
Представление SQL
Select NewID() as Id, ProductName as Name, --More columns
From Product
Класс
public class ProductView
{
public virtual Id {get; set;}
public virtual Name {get; set;}
}
Мне не нужен идентификатор для продукта, или в случае некоторых представлений у меня не может быть идентификатора для представления, в зависимости от того, если я управляю Представлением
Существует ли лучший способ отобразить представления на объекты в nhibernate?
Править
Ответ до сих пор
Отображение
<class name="ProductView" table="viewProduct" mutable="false" >
<id name="Id" type="Guid" />
<property name="Name" />
<!-- more properties -->
</class>
Класс
public class ProductView
{
public virtual Name {get; set;}
//more properties
}
Представление SQL
Мне все еще нужен NewID ()?
Select NewID() as Id, ProductName as Name, --More columns
From Product
Вы можете сделать это немного чище, не сопоставляя Id со свойством и опуская генератор:
<id column="Id" type="guid"/>
Таким образом, вы сохраните проблему на уровне данных, без утечки деталей реализации в ваш домен.
Насколько мне известно, NHibernate потребует определение идентификатора или составного идентификатора , поскольку это механизм, с помощью которого он однозначно идентифицирует данную запись. Если не существует комбинации столбцов, которая предоставляет ключ для каждой строки в представлении, я думаю, вы застряли в хитрых обходных путях.