Strategies for Mapping Views in NHibernate

2019-02-17 02:03发布

问题:

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  

回答1:

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.



回答2:

As far as I know, NHibernate will require either an id or a composite-id definition since it's the mechanism by which it uniquely identifies a given record. If there is no combination of columns that provides a key for each row in the view, I think you are stuck with hacky workarounds.