我试图弄清楚NHibernate如何为我从以前的开发人员继承的游戏项目分配ID。
从网上上传新照片后,API会执行以下操作:
children.Add(e);
return Session.Save(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吗?
谢谢!
答案 0 :(得分:1)
将“临时”实例添加到NH会话后,通过Save()
方法,NH将根据类型的ID生成策略为其分配ID。我不确定“增强型”序列与常规序列有何不同,但是,看看这些类(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;
}