12

我正在尝试映射没有标识符的视图,但 nhibernate 仍然会生成带有 id 列的 sql(给我一个 sql 错误,因为 db 中不存在 ID 列)。也许我误解了 Id() 构造函数?

构造函数评论:

创建一个在域对象或数据库中没有相应属性的 Id。这主要用于只读访问和/或视图。默认为带有“增量”生成器的 int 标识。

public class PersonMapping : ClassMap<Person>
{
    public PersonMapping()
    {
        Table("person");
        ReadOnly();

        Id();
        Map(f => f.Name, "name");
    }
}
4

2 回答 2

8

NHibernate 需要一个 ID。方法文档说它创建了一个在您的域对象中没有相应属性的 ID - 但是数据库仍然有一个 ID。

如果您的表中没有要标记为标识符的字段(必须是唯一的..),也许您可​​以尝试识别一些可以组合为复合 id 的列。

例如,给定一个简单的链接表,它将一些 int 链接到另一个 int,如

A | B
-----
1 | 2
1 | 3
2 | 2

只要所有 A/B 组合都是唯一的,您就可以使用复合 ID。

public PersonMapping()
{
    [...]
     CompositeId()
         .KeyProperty(x => x.A)
         .KeyProperty(x => x.B);
    [...]
}
于 2010-08-17T15:23:40.707 回答
5

您可以将记录检索为值对象(非托管实体)而不是实体。

" 14.1.5. 返回非托管实体

可以将 anIResultTransformer应用于本机 sql 查询。允许它返回例如非托管实体。

sess.CreateSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
    .SetResultTransformer(Transformers.AliasToBean(typeof(CatDTO)))

此查询指定:

  • SQL 查询字符串
  • 结果转换器

上面的查询将返回一个列表,CatDTO该列表已被实例化并将其值NAME注入BIRTHNAME其相应的属性或字段。"

于 2010-11-18T09:53:23.803 回答