2009-06-15 101 views
9

有沒有可能在不使用Id的情況下在NHibernate中進行映射?沒有Id的NHibernate映射

我想要做的是,通過調用

session.CreateSqlQuery(myQuery).AddEntity(typeof(MyEntity)); 

程序存儲過程是一個聚合並沒有返回沒有ID字段,但我還是想利用NHibernate的映射數據返回到實體中。到目前爲止我唯一想到的是讓程序添加一個字段「O as Id」或其他東西,並讓該實體具有僞造的Id字段。

回答

3

我發現這真的不可能。從存儲過程返回的數據也必須有一個Id。它的工作原理是創建一個帶有Id和對象的虛擬屬性的虛擬列,但我只是決定手動將NHibernate返回的數據轉換爲對象。

基本上,你不應該在NHibernate中使用存儲過程。它畢竟是一個ORM。就我而言,我別無選擇,只能使用該程序。

0

我需要仔細檢查xsd,但我相信id或composite-id是必需的。但是,根據文檔,名稱不是必需的。所以,你應該能夠指定一個幾乎空白的ID部分。

在類似的情況下,我將類設置爲mutable =「false」,並將id映射到行索引,並將id映射中的生成器設置爲分配。

+1

好的 - 啞巴的問題。如何映射到行索引?這在映射文件中看起來如何?我們在文檔中找到了這個,並決定提問。 – ferventcoder 2009-06-26 16:45:24

4

即使您的實體沒有Id字段,它也必須以某種方式「唯一」。

時一起決定其性質,必須是唯一的,並且使用了他們一個複合鍵...

<composite-id> 
    <key-property name="Property1" column="Column1"/> 
    <key-property name="Property2" column="Column2"/> 
</composite-id> 
0

從@Andy McCluggage的帖子:

可以在非常做到這一點映射:

<composite-id> 
    <key-property name="Property1" column="Column1"/> 
    <key-property name="Property2" column="Column2"/> 
</composite-id> 

但是,你必須重載equals()和GetHashCode()在你的模型:

public class MyClass 
{ 
    public virtual DateTime Property1; 
    public virtual string Property2; 
    public virtual int SomeOtherProperty; 

    public override bool Equals(object obj) 
    { 
     if(obj == null) 
      return false; 

     var t = obj as MyClass; 

     if(t == null) 
      return false; 

     if (this.Property1 == t.Property1 && this.Property2 == t.Property2) 
      return true; 

     return false; 
    } 

    public override int GetHashCode() 
    { 
     return (this.Property1 + "|" + this.Property2).GetHashCode(); 
    } 
}