我正在尝试映射没有标识符的视图,但是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");
}
}
答案 0 :(得分:8)
NHibernate需要一个ID。方法doc说它创建了一个在域对象中没有相应属性的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);
[...]
}
答案 1 :(得分:5)
您可以将记录检索为值对象(非托管实体)而不是实体。
“ 14.1.5。返回非托管实体
可以将IResultTransformer
应用于本机sql查询。允许它例如返回非托管实体。
sess.CreateSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
.SetResultTransformer(Transformers.AliasToBean(typeof(CatDTO)))
此查询指定:
上述查询将返回已CatDTO
的列表,该列表已经过实例化,并将NAME
和BIRTHNAME
的值注入其相应的属性或字段中。 “