没有Id的NHibernate映射

时间:2009-06-15 02:58:35

标签: nhibernate

是否可以在不使用Id的情况下在NHibernate中进行映射?

我要做的是,使用

调用存储过程
session.CreateSqlQuery( myQuery ).AddEntity( typeof( MyEntity ) );

该过程是一个聚合,并且没有返回Id字段,但我仍然希望利用NHibernate映射返回到实体的数据。到目前为止,我唯一想到的是让程序添加一个字段“O as Id”或者其他东西,让实体有一个虚假的Id字段。

4 个答案:

答案 0 :(得分:4)

您的实体必须以某种方式“独特”,即使它没有Id字段。

确定哪些属性在一起时必须是唯一的,并使用复合键...

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

答案 1 :(得分:3)

我发现这真的不可能。从存储过程返回的数据也必须具有Id。它只是创建一个带有Id的虚拟列,以及对象上的虚拟属性,但我只是决定将NHibernate返回的数据手动转换为对象。

基本上,你不应该在NHibernate中使用存储过程。这是一个ORM毕竟。就我而言,我别无选择,只能使用这个程序。

答案 2 :(得分:1)

来自@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();
    }
}

答案 3 :(得分:0)

我需要仔细检查xsd,但我相信id或composite-id都是必需的。但是,根据文档,名称不是必需的。因此,您应该能够指定几乎空白的ID部分。

在类似情况下,我将类设置为mutable =“false”并将id映射到行索引,并将id映射中的生成器设置为已分配。