覆盖 EF Core 值生成器

问题描述 投票:0回答:1

我想覆盖默认的

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);
    }
}

但我认为替换默认值生成器是更有效的方法。

  • 如何在 EF 模型配置阶段替换/覆盖 EF Core 中的默认值生成器?
  • 也许有某种服务提供商可以创建 EF 服务或类似的东西?
c# .net entity-framework entity-framework-core .net-9.0
1个回答
0
投票

您可以通过实现自己的

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.