有没有可能在不使用Id的情况下在NHibernate中进行映射?没有Id的NHibernate映射
我想要做的是,通过调用
session.CreateSqlQuery(myQuery).AddEntity(typeof(MyEntity));
程序存储过程是一个聚合并没有返回没有ID字段,但我还是想利用NHibernate的映射数据返回到实体中。到目前为止我唯一想到的是让程序添加一个字段“O as Id”或其他东西,并让该实体具有伪造的Id字段。
有没有可能在不使用Id的情况下在NHibernate中进行映射?没有Id的NHibernate映射
我想要做的是,通过调用
session.CreateSqlQuery(myQuery).AddEntity(typeof(MyEntity));
程序存储过程是一个聚合并没有返回没有ID字段,但我还是想利用NHibernate的映射数据返回到实体中。到目前为止我唯一想到的是让程序添加一个字段“O as Id”或其他东西,并让该实体具有伪造的Id字段。
我发现这真的不可能。从存储过程返回的数据也必须有一个Id。它的工作原理是创建一个带有Id和对象的虚拟属性的虚拟列,但我只是决定手动将NHibernate返回的数据转换为对象。
基本上,你不应该在NHibernate中使用存储过程。它毕竟是一个ORM。就我而言,我别无选择,只能使用该程序。
我需要仔细检查xsd,但我相信id或composite-id是必需的。但是,根据文档,名称不是必需的。所以,你应该能够指定一个几乎空白的ID部分。
在类似的情况下,我将类设置为mutable =“false”,并将id映射到行索引,并将id映射中的生成器设置为分配。
即使您的实体没有Id字段,它也必须以某种方式“唯一”。
时一起决定其性质,必须是唯一的,并且使用了他们一个复合键...
<composite-id>
<key-property name="Property1" column="Column1"/>
<key-property name="Property2" column="Column2"/>
</composite-id>
从@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();
}
}
好的 - 哑巴的问题。如何映射到行索引?这在映射文件中看起来如何?我们在文档中找到了这个,并决定提问。 – ferventcoder 2009-06-26 16:45:24