2010-06-03 96 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