NHibernate 使用 sys.sequences 将新 ID 插入数据库的步骤

Steps that NHibernate takes to insert new id into database using sys.sequences

我想弄清楚 NHibernate 如何为我从以前的开发人员那里继承的游戏项目分配 ID。

从网络上传新照片时,API 执行此操作:

children.Add(e);
return Session.Save(e);

Session 是一个 NHibernate session.

有一个数据库 table 用于包含 ID、标题和大小列的照片。

id 列使用 sys.sequences 中的序列作为 id,它不是标识列。序列的名称是:nextGamePhotoId

当我 运行 Visual Studio 在调试模式下单步执行每个进程时,我看到了:

尽管 运行通过我的调试器,我无法弄清楚 NHibernate 如何或在何处分配 "id"。

照片 class 使用 NHibernate.Mapping.ByCode 映射,如下所示:

 public class GamePhotoMapping : ClassMapping<GamePhoto>
    {
        public GamePhotoMapping()
        {
            Schema("game");
            this.EnhancedSequenceId(x => x.Id, "nextGamePhotoId");
            Property(x => x.Title, gp => gp.NotNullable(true));
            Property(x => x.size);
        }
    }

这是我在代码中唯一看到对序列 (nextGamePhotoId) 的引用的地方。

所以我猜 NHibernate 在幕后做了一些事情?

有谁知道 NHibernate 究竟是如何获取和分配 id 的?

谢谢!

当'transient'实例被添加到NH会话中时,通过Save()方法,NH会根据类型的id生成策略为其分配一个id。我不确定 'enhanced' 序列与常规序列有何不同,但是,看一下这些 类 (SequenceGenerator, MsSql2012Dialect) 表明它只是从适当的选择下一个键数据库序列:

public override string GetSequenceNextValString(string sequenceName)
{
    return "select " + GetSelectSequenceNextValString(sequenceName) + " as seq";
}

public override string GetSelectSequenceNextValString(string sequenceName)
{
    return "next value for " + sequenceName;
}