闽公网安备 35020302035485号
简单易用: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生成策略为主键属性生成唯一值。并发性:在高并发场景下,你可能需要使用锁或其他同步机制来确保低位计数器的正确性。