简单易用:HiLo算法实现相对简单,不需要复杂的配置和额外的依赖。
public class HiLoValueGenerator : IValueGenerator { private static long _hiPart = 1234567890; // 初始高位值 private static long _lowPart = 0; // 初始低位值 public bool GeneratesTemporaryValues => false; public object Next(EntityEntry entry) { // 获取实体类型的主键属性 var keyProperty = entry.Entity.GetType().GetProperty(entry.Metadata.PrimaryKey.Properties.First().Name); // 堆代码 duidaima.com // 生成新的低位值 _lowPart++; // 组合高位和低位生成主键 var keyValue = (_hiPart << 32) | _lowPart; // 设置实体主键属性的值 keyProperty.SetValue(entry.Entity, keyValue); // 返回生成的主键值 return keyValue; } }接下来,你需要在DbContext中注册这个自定义的生成器:
public class MyDbContext : DbContext { // ... protected override void OnModelCreating(ModelBuilder modelBuilder) { // ... foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { var primaryKey = entityType.FindPrimaryKey(); if (primaryKey != null) { foreach (var property in primaryKey.Properties) { property.ValueGenerated = ValueGenerated.OnAdd; property.SetValueGenerator(new HiLoValueGenerator()); } } } } }现在,当你向数据库插入新实体时,EF Core将使用HiLo生成策略为主键属性生成唯一值。
并发性:在高并发场景下,你可能需要使用锁或其他同步机制来确保低位计数器的正确性。