是否可以在不使用Id的情况下在NHibernate中进行映射?
我要做的是,使用
调用存储过程session.CreateSqlQuery( myQuery ).AddEntity( typeof( MyEntity ) );
该过程是一个聚合,并且没有返回Id字段,但我仍然希望利用NHibernate映射返回到实体的数据。到目前为止,我唯一想到的是让程序添加一个字段“O as Id”或者其他东西,让实体有一个虚假的Id字段。
答案 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映射中的生成器设置为已分配。