功能NHibernate自动递增非关键(Id)的财产(fluent nhibernate auto

2019-06-26 10:03发布

是否有可能有由数据库管理的一类自动递增的整数属性,但不是主键(或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