似乎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
答案 0 :(得分:5)
你可以通过不将Id映射到属性并省略生成器来使它更清洁一点:
<id column="Id" type="guid"/>
这样,您就可以将问题保留在数据层中,而不会将实施细节泄露给您的域。
答案 1 :(得分:2)
据我所知,NHibernate将需要id或composite-id定义,因为它是唯一标识给定记录的机制。如果没有为视图中的每一行提供键的列组合,我认为你会遇到hacky变通办法。