Entity Framework Core 使用HiLo(高低位模式)生成主键

Hi(高位):数据库生成,比如100、200、300

Lo(低位):本地生成,比如101、201、301

数据库给本地分配一个范围,范围用于主键的自增。

每次连接数据库的时候和当范围用完的时候都会从数据库中重新取出一个范围。

实体类:

[Table("T_Menu")]
public class Menu
{
    public int Id { get; set; }
    public string Name { get; set; }
}
// 实体类的配置类
public class MenuConfig : IEntityTypeConfiguration<Menu>
{
    public void Configure(EntityTypeBuilder<Menu> builder)
    {
        // 给Id列设置高低位默认
        // 在数据库中创建一个名为DBSequenceHiLo的序列
        builder.Property(p => p.Id).UseHiLo("DBSequenceHiLo");
        // 可以不设置序列名称
        builder.Property(p => p.Id).UseHiLo();
    }
}

DBContext类:

可以不用写这个,默认序列从1开始,每次范围有10个

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 给指定的序列设置范围 StartsAt(起始编号) IncrementsBy(这个范围有几个编号)
    modelBuilder.HasSequence("DBSequenceHiLo").StartsAt(100).IncrementsBy(5);
    base.OnModelCreating(modelBuilder);
    // 从当前程序集加载所有的IEntityTypeConfigration
    modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
}

使用:

content.Menus.Add(new Menu() { Name = "text1" });
content.Menus.Add(new Menu() { Name = "text2" });
content.Menus.Add(new Menu() { Name = "text3" });
await content.SaveChangesAsync();

content.Menus.Add(new Menu() { Name = "atext1" });
content.Menus.Add(new Menu() { Name = "atext2" });
content.Menus.Add(new Menu() { Name = "atext3" });
await content.SaveChangesAsync();

如果上面的代码和下面的代码分两次运行,则生成的Id分别是:

101,text1

102,text2

103,text3

105,atext1

106,atext2

107,atext3

posted @ 2024-03-01 11:01  Simian_2018_12_22  阅读(57)  评论(0编辑  收藏  举报