我正试图弄清楚NHibernate是如何为我从以前的开发人员那里继承的游戏项目分配id的。
当从网络上传新照片时,API执行此操作:
children.Add(e);
return Session.Save(e);
- 其中children=照片对象的数组{id,title,size}
- 其中e=正在上传并添加到儿童
会话是NHibernate会话。
有一个用于照片的数据库表,其中包含id、标题和大小列。
id列使用sys.sequences中的序列作为id,它不是标识列。序列名称为:nextGamePhotoId
当我在调试模式下运行Visual Studio并逐步完成每个过程时,我会看到:
在Session.Save((调用之前,新的照片对象e的id为零
在Session.Save((调用之后,e有一个新的id,该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的吗?
谢谢!
当"transient"实例通过Save()
方法添加到NH会话时,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;
}