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

Mat*_*nce 14 nhibernate fluent-nhibernate

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

ano*_*ous 9

两种选择.

  • 如果数据库100%对此负责,您只需告诉NHibernate该属性已生成,而不是将其包含在任何更新/ isnerts中.缺点是NH需要进行额外的选择以保持内存中的新鲜值.

    <property name ="Foo"generated ="always"update ="false"insert ="false"/>

  • 如果数据库不负责,并且您只想自动完成此操作,则可以使用拦截器在插入上将值设置为1并在更新时将其递增1.

http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptor(11.1 - 拦截器)

您将覆盖OnSave()以查找属性并设置初始值,然后重写OnFlushDirty()以查找属性属性和增量.


编辑:

我是个白痴,没注意到你说Fluent NHibernate.


编辑#2:

我想您可能也有兴趣将此列用作版本控制?

< version name="Foo" generated="always" />
Run Code Online (Sandbox Code Playgroud)


Fer*_*ira 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,整数设置为由数据库生成,并指示NHibernate在插入时检索它.

值得注意的是,映射只是答案的一半是很重要的,它会不会如果列不是以身份创建工作.CustomSqlType被添加到映射中,目的是在使用SchemaExport生成表时创建正确的sql.这是生成的sql:

 create table [Potato] (
         Id UNIQUEIDENTIFIER not null,
        LegacyId INT IDENTITY(1,1) not null,
        primary key (Id)
     )
Run Code Online (Sandbox Code Playgroud)

另一方面,ReadOnly和Generated.Insert()将告诉NHibernate该值仅在插入时由数据库自动生成,因此它必须在数据库中查询每次插入时的值.

请注意,我只使用Sql Server对此进行了测试.自定义类型可能会更改,也可能在其他数据库中不可用.