NHibernate中映射视图的策略

时间:2010-06-03 02:44:47

标签: nhibernate nhibernate-mapping views

似乎NHibernate需要将一个id标记指定为映射的一部分。这给视图带来了问题,因为大多数时候(根据我的经验)视图都没有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;}
}

我不需要产品的ID或者在某些视图的情况下我可能没有视图的ID,具体取决于我是否可以控制视图

是否有更好的方法将视图映射到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 个答案:

答案 0 :(得分:5)

你可以通过不将Id映射到属性并省略生成器来使它更清洁一点:

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

这样,您就可以将问题保留在数据层中,而不会将实施细节泄露给您的域。

答案 1 :(得分:2)

据我所知,NHibernate将需要id或composite-id定义,因为它是唯一标识给定记录的机制。如果没有为视图中的每一行提供键的列组合,我认为你会遇到hacky变通办法。