fluent nhibernate自动递增非键(Id)属性

fluent nhibernate自动递增非键(Id)属性,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,是否可以由数据库管理类auto increment的integer属性,但不能作为主键(或NHibernate所指的Id)?我很难找到这样做的例子。任何帮助都将不胜感激。谢谢。两种选择 如果数据库对此负有100%的责任,您只需要告诉NHibernate该属性已生成,而不需要将其包含在任何更新/isnerts中。缺点是NH需要进行额外的选择,以使该值在内存中保持新鲜

是否可以由数据库管理类auto increment的integer属性,但不能作为主键(或NHibernate所指的Id)?我很难找到这样做的例子。任何帮助都将不胜感激。谢谢。

两种选择

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

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

(11.1-拦截器)

您可以重写OnSave()以查找属性并设置初始值,然后重写OnFlushDirty()以查找属性并递增


编辑:

我是个白痴,没注意到你说的是流利的NHibernate


编辑#2:

我想您可能也对使用本专栏作为版本控制感兴趣

< version name="Foo" generated="always" />
这对我很有用:

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


请注意,我只使用Sql Server测试了这一点。自定义类型可能会更改,或者在其他数据库中不可用。

别担心,它几乎相同。Map(x=>x.Foo).ReadOnly().SetAttribute(“生成的”,“始终”);SetAttribute将替换为Generated.Always,当我们达到1.0时。我下载了最新的FNH,有点被.Update()不带参数弄糊涂了。我不确定在映射中会出现什么结果。不过ReadOnly()还是有道理的。
 create table [Potato] (
         Id UNIQUEIDENTIFIER not null,
        LegacyId INT IDENTITY(1,1) not null,
        primary key (Id)
     )