2009-06-15 195 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(); 
    } 
}