GuidValueGenerator
,这样它将使用 Guid.CreateVersion7()
方法而不是 Guid.NewGuid()
。
我尝试为每个
Guid
属性设置自定义值生成器,迭代模型构建器元数据并且它有效。
public static void SetValueGeneratorOnAdd<T>(this ModelBuilder builder, string columnName, ValueGenerator<T> generator)
{
var clrType = typeof(T);
var properties = builder.Model.GetEntityTypes().SelectMany(
entity => entity.GetProperties().Where(
property => property.Name.Equals(columnName, StringComparison.Ordinal)
&& property.ClrType == clrType));
foreach (var property in properties)
{
property.ValueGenerated = ValueGenerated.OnAdd;
property.SetValueGeneratorFactory((prop, type) => generator);
}
}
但我认为替换默认值生成器是更有效的方法。
您可以通过实现自己的
GuidValueGenerator
来做到这一点,如下例所示:
public class GuidValueGenerator : ValueGenerator<Guid>
{
public override bool GeneratesTemporaryValues => false;
public override Guid Next(EntityEntry entry)
{
return Guid.NewGuid(); // or other generation
}
}
并按如下方式注册:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>()
.Property(x => x.MyGuidProperty)
.HasValueGenerator(typeof(GuidValueGenerator));
base.OnModelCreating(modelBuilder);
}