Strategies for Mapping Views in NHibernate

Nathan Fisher picture Nathan Fisher · Jun 3, 2010 · Viewed 12k times · Source

It seems that NHibernate needs to have an id tag specified as part of the mapping. This presents a problem for views as most of the time (in my experience) a view will not have an Id. I have mapped views before in nhibernate, but they way I did it seemed to be be messy to me.

Here is a contrived example of how I am doing it currently.

Mapping

  <class name="ProductView" table="viewProduct" mutable="false" >
    <id name="Id" type="Guid" >
      <generator class="guid.comb" />
    </id>
    <property name="Name" />
<!-- more properties -->
  </class>

View SQL

Select NewID() as Id, ProductName as Name, --More columns
From Product  

Class

public class ProductView
{
    public virtual Id {get; set;}
    public virtual Name {get; set;}
}

I don't need an Id for the product or in the case of some views I may not have an id for the view, depending on if I have control over the View

Is there a better way of mapping views to objects in nhibernate?

Edit
Answer So Far

Mapping

  <class name="ProductView" table="viewProduct" mutable="false" >
    <id name="Id" type="Guid" />
    <property name="Name" />
    <!-- more properties -->
  </class>

Class

 public class ProductView
    {
        public virtual Name {get; set;}
        //more properties
    }

View SQL
Do I still need NewID()?

Select NewID() as Id, ProductName as Name, --More columns
From Product  

Answer

Diego Mijelshon picture Diego Mijelshon · Jun 3, 2010

You can make it just a little bit cleaner by not mapping the Id to a property and omitting the generator:

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

That way, you keep the problem in the data layer, without leaking the implementation detail to your domain.