Стратегии для картирования представлений в NHibernate - PullRequest
8 голосов
/ 03 июня 2010

Кажется, что NHibernate должен иметь тег id, указанный как часть отображения. Это представляет проблему для представлений, поскольку в большинстве случаев (по моему опыту) представление не будет иметь идентификатора. Раньше я отображал виды в 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  

Ответы [ 2 ]

5 голосов
/ 03 июня 2010

Вы можете сделать его немного чище, не отображая Id в свойстве и не указав генератор:

<id column="Id" type="guid"/>

Таким образом, вы сохраняете проблему на уровне данных, не передавая детали реализации в ваш домен.

2 голосов
/ 03 июня 2010

Насколько я знаю, NHibernate потребует либо определения идентификатора, либо определения композитный-идентификатор , поскольку это механизм, с помощью которого он однозначно идентифицирует данную запись. Если нет комбинации столбцов, предоставляющей ключ для каждой строки в представлении, я думаю, что вы застряли на хакерских обходных путях.

...