流畅的NHibernate获取视图,没有唯一标识符

Wya*_*ass 12 nhibernate fluent

我正在尝试映射没有标识符的视图,但是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");
    }
}
Run Code Online (Sandbox Code Playgroud)

Zeb*_*ebi 8

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

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

举例来说,一个简单的链接表将一些int链接到另一个int

A | B
-----
1 | 2
1 | 3
2 | 2
Run Code Online (Sandbox Code Playgroud)

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

public PersonMapping()
{
    [...]
     CompositeId()
         .KeyProperty(x => x.A)
         .KeyProperty(x => x.B);
    [...]
}
Run Code Online (Sandbox Code Playgroud)


J F*_*des 5

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

" 14.1.5.返回非管理实体

可以应用IResultTransformer本机SQL查询.允许它例如返回非托管实体.

sess.CreateSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
    .SetResultTransformer(Transformers.AliasToBean(typeof(CatDTO)))
Run Code Online (Sandbox Code Playgroud)

此查询指定:

  • SQL查询字符串
  • 结果变压器

上述查询将返回的列表CatDTO已被实例化并注入的值NAMEBIRTHNAME到它的相应的属性或字段."