流畅的nhibernate自动增量非键(Id)属性

时间:2009-07-20 19:36:14

标签: nhibernate fluent-nhibernate

是否可以拥有由数据库管理的类自动增量的整数属性,但不能是主键(或NHibernate引用的ID)?我很难找到如何做到这一点的例子。任何帮助,将不胜感激。感谢。

2 个答案:

答案 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对此进行了测试。自定义类型可能会更改,也可能在其他数据库中不可用。