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);
- 其中 children = 照片数组 objects{id, title, size}
- 其中 e = 新照片 object 正在上传并添加到数组中
children
Session 是一个 NHibernate session.
有一个数据库 table 用于包含 ID、标题和大小列的照片。
id 列使用 sys.sequences 中的序列作为 id,它不是标识列。序列的名称是:nextGamePhotoId
当我 运行 Visual Studio 在调试模式下单步执行每个进程时,我看到了:
在 Session.Save() 调用之前,新照片 object, e, 的 ID 为
零。
在 Session.Save() 调用之后,e 有一个新的 id,等于 sys.sequences table 中的 current_value + 1 .
尽管 运行通过我的调试器,我无法弄清楚 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;
}
我想弄清楚 NHibernate 如何为我从以前的开发人员那里继承的游戏项目分配 ID。
从网络上传新照片时,API 执行此操作:
children.Add(e);
return Session.Save(e);
- 其中 children = 照片数组 objects{id, title, size}
- 其中 e = 新照片 object 正在上传并添加到数组中 children
Session 是一个 NHibernate session.
有一个数据库 table 用于包含 ID、标题和大小列的照片。
id 列使用 sys.sequences 中的序列作为 id,它不是标识列。序列的名称是:nextGamePhotoId
当我 运行 Visual Studio 在调试模式下单步执行每个进程时,我看到了:
在 Session.Save() 调用之前,新照片 object, e, 的 ID 为 零。
在 Session.Save() 调用之后,e 有一个新的 id,等于 sys.sequences table 中的 current_value + 1 .
尽管 运行通过我的调试器,我无法弄清楚 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;
}