是否有可能有由数据库管理的一类自动递增的整数属性,但不是主键(或ID为NHibernate的是指它们)? 我无法找到如何做到这一点的例子。 任何帮助,将不胜感激。 谢谢。
Answer 1:
两种选择。
如果数据库是该负责100%,你只需要告诉NHibernate的该属性产生的,而不是把它列入任何更新/ isnerts。 不足之处是NH需要做一个额外的选择,以保持新鲜值在内存中。
<属性名=“foo”的产生=“总是”更新=“假”插入=“假” />
如果数据库是不负责,你只是想有这种自动完成,你可以使用拦截器设置在插入值,以1和1上的更新,以增加它。
http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors (11.1 -拦截器)
你会重写的OnSave()找物业和设置的初始值,然后覆盖OnFlushDirty()来查找财产属性和增量。
编辑:
我是个白痴,没有注意到你功能NHibernate说。
编辑#2:
我想你可能也有兴趣使用此列作为一个版本?
< version name="Foo" generated="always" />
Answer 2:
这对我的作品:
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)
)
在另一边,只读和Generated.Insert()会告诉NHibernate的该值由数据库仅在插入自动生成的,因此它必须在数据库中查询在每次插入值。
请注意,我只与SQL Server测试这一点。 自定义类型可能会改变或可能无法在其他数据库可用。
文章来源: fluent nhibernate auto increment non key (Id) property