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 中映射没有标识列的视图?

NHibernate之(14):探索NHibernate中使用视图

NHibernate之旅(14):探索NHibernate中使用视图

Nhibernate学习教程-- 开篇有益

NHIbernate 和安全/业务层

NHibernate:在更新/删除/插入视图上映射的类时是否可以使用存储过程?