是否可以拥有由数据库管理的类自动增量的整数属性,但不能是主键(或NHibernate引用的ID)?我很难找到如何做到这一点的例子。任何帮助,将不胜感激。感谢。
答案 0 :(得分:9)
两个选项。
如果数据库100%对此负责,您只需告诉NHibernate该属性已生成,而不是将其包含在任何更新/ isnerts中。缺点是NH需要进行额外的选择以保持内存中的新鲜值。
< property name =“Foo”generated =“always”update =“false”insert =“false”/>
如果数据库不负责,并且您只想自动完成此操作,则可以使用拦截器在插入上将值设置为1并在更新时将其递增1。
< / LI>http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors(11.1 - 拦截器)
您将覆盖OnSave()以查找属性并设置初始值,然后重写OnFlushDirty()以查找属性属性和增量。
编辑:
我是个白痴,没注意到你说过流利的NHibernate。
编辑#2:
我想您可能也有兴趣将此列用作版本控制?
< version name="Foo" generated="always" />
答案 1 :(得分:5)
这对我有用:
public class Potato
{
public virtual Guid Id { get; protected set; }
public virtual int LegacyId { get; protected set; }
}
public class PotatoMap : ClassMap<Potato>
{
public PotatoMap()
{
Id(x => x.Id).GeneratedBy.GuidComb();
Map(x => x.LegacyId).CustomSqlType("INT IDENTITY(1,1)").Not.Nullable().ReadOnly().Generated.Insert();
}
}
基本上,整数设置为由数据库生成,并指示NHibernate在插入时检索它。
重要的是要注意,映射只是答案的一半,如果列未创建为IDENTITY,则不将起作用。 CustomSqlType 被添加到映射中,目的是在使用SchemaExport生成表时创建正确的sql。这是生成的sql:
create table [Potato] (
Id UNIQUEIDENTIFIER not null,
LegacyId INT IDENTITY(1,1) not null,
primary key (Id)
)
另一方面,ReadOnly和Generated.Insert()将告诉NHibernate该值仅在插入时由数据库自动生成,因此它必须在数据库中查询每次插入时的值。
请注意,我只使用Sql Server对此进行了测试。自定义类型可能会更改,也可能在其他数据库中不可用。