NHibernate 中映射视图的策略
Posted
技术标签:
【中文标题】NHibernate 中映射视图的策略【英文标题】:Strategies for Mapping Views in NHibernate 【发布时间】:2010-06-03 02:44:47 【问题描述】:似乎 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
【问题讨论】:
【参考方案1】:您可以通过不将 Id 映射到属性并省略生成器来使其更简洁:
<id column="Id" type="guid"/>
这样,您可以将问题保留在数据层中,而不会将实现细节泄露给您的域。
【讨论】:
这是否意味着我可以从 TSQL Select 中删除 NewID(),因为它只是为了满足 nhibernate 对 ID 的需求 不,这意味着您的班级不需要 Id 属性。 本说得对。 NHibernate 不需要将 Id 映射到属性,但它始终需要一种识别持久实例的方法。 感谢迭戈,本。好的,看看我是否理解正确。我需要在映射中包含 id 标记,我的类中不需要 Id 属性。那么我是否需要将 newid() 作为 sql 的一部分,或者也可以将其删除,并且 nhibernate 会为其分配一个 guid? 你仍然需要 newid(); NHibernate 只能在保存时分配 Id,而不是在加载时弥补它们。【参考方案2】:据我所知,NHibernate 将需要 id 或 composite-id 定义,因为它是唯一标识给定记录的机制。如果没有为视图中的每一行提供键的列组合,我认为您会遇到麻烦的解决方法。
【讨论】:
我希望当您将类标记为mutable=false
时,对 Id 的显式需求消失。不确定这是否实用,但会使这样的场景更容易处理,imo。以上是关于NHibernate 中映射视图的策略的主要内容,如果未能解决你的问题,请参考以下文章
NHibernate之(14):探索NHibernate中使用视图