这段代码将创建一个默认名称为“EntityFrameworkHiLoSequence”的新序列,因为没有指定名字。您也可以定义多个HiLo序列。例如:
protected override void OnModelCreating(ModelBuilder modelbuilder) { modelbuilder.ForSqlServerUseSequenceHiLo("DBSequenceHiLo"); modelbuilder.Entity<Category>() .Property(o => o.CategoryID).ForSqlServerUseSequenceHiLo(); }在数据库中,将创建两个序列。Category实体将使用EntityFrameworkHiLoSequence序号,所有其它实体使用DBSequenceHiLo序列。
配置HiLo序列ForSqlServerHasSequence扩展方法不能更改起始值和增量值的选项。但是,有一种方法来定义这些选项。首先,使用HasSequence方法定义序列的StartAt和IncrementBy选项,然后再使用ForSqlServerUseSequenceHiLo()扩展方法,要保持序列的名称一致。例如:
modelbuilder.HasSequence<int>("DBSequenceHiLo") .StartsAt(1000).IncrementsBy(5); modelbuilder.ForSqlServerUseSequenceHiLo("DBSequenceHiLo");在这种情况下,生成DBSequenceHiLo的脚本如下。
CREATE SEQUENCE [dbo].[DBSequenceHiLo] AS [int] -GO
所以当我们执行相同的代码插入3个Category实体,那么主键的值将从1000开始。
而且由于IncrementBy选项设置为“5”,所以当在上下文中添加第6个插入时,将进行数据库调用以获得下一个序列值。以下是插入3个Category实体然后插入3个的Product实体时SQL Server profiler的屏幕截图,您可以看到数据库调用获取序列的下一个值的次数是2次。
如果您对在Entity Framework Core中使用HiLo生成主键感兴趣,不防自己动手测试一下。
参考资料: