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

时间:2018-07-31 19:14:44

标签: nhibernate nhibernate-mapping

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

从网上上传新照片后,API会执行以下操作:

children.Add(e);
return Session.Save(e);
  • 其中子项=照片对象的数组{id,标题,大小}
  • 其中e =要上传并添加到的数组中的新照片对象 孩子们

会话是NHibernate会话。

有一张用于存放照片的数据库表,其中包含ID,标题和大小列。

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

当我在调试模式下运行Visual Studio并逐步执行每个过程时,会看到以下内容:

  • 在调用Session.Save()之前,新的照片对象e的ID为 零。

  • 在调用Session.Save()之后,e的新ID等于sys.sequences表中的current_value + 1。

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

使用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吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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