2010-06-03 83 views
8

似乎NHibernate需要将一个id标记指定为映射的一部分。这在大多数情况下都会带来问题(根据我的经验),视图不会有Id。我之前在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;} 
} 

我并不需要一个ID为在p roduct或在一些意见的情况下,我可能没有一个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 

回答

5

你可以把它只是通过不映射将ID属性和省略产生一点点清洁:

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

这样一来,你一直在数据层的问题,而不泄漏的实现细节到您的域名。

+0

是否意味着我可以从TSQL Select中删除NewID(),因为它仅用于满足nhibernate需要的ID – 2010-06-03 05:53:24

+2

否,这意味着您的类不需要Id属性。 – 2010-06-03 12:21:53

+0

本的权利。 NHibernate不需要将Id映射到一个属性,但它总是需要一种方法来标识持久化实例。 – 2010-06-03 15:09:15

2

据我所知,NHibernate的需要的ID或者是一个composite-id定义,因为它是由它唯一标识一个给定记录的机制。如果没有为视图中的每一行提供键的列的组合,我认为您被困扰于解决方法。

+2

我希望当你将一个类标记为'mutable = false'时,明确需要一个Id消失。不知道这是否实用,但会使这种情况更容易处理,即时通讯。 – 2010-06-03 03:58:52