Ich möchte alle Guid.NewGuid() in den ID-Spalten meiner Datenbank durch ersetzen die Version 7, die mit .NET 9 ausgeliefert wurde: Guid.CreateVersion7().
EF Core scheint hierfür keine sofort einsatzbereite Möglichkeit zu bieten. Also habe ich eine benutzerdefinierte Lösung implementiert.
Allerdings kann ich anscheinend keine Möglichkeit finden, dies sofort auf EF Core zu tun.
Die Lösung, die ich gefunden habe, funktioniert, aber ich bin es Ich bin mir nicht sicher, ob es das beste (oder sogar ein gutes) ist.
Das habe ich gemacht:
- Erstellen Sie einen benutzerdefinierten Wertgenerator für v7-Guids.
- Erstellen Sie eine benutzerdefinierte Konvention, die verwendet den benutzerdefinierten Generator
- Registrieren Sie diese Konvention global bei EF Core
Code: Select all
public class GuidV7ValueGenerator : ValueGenerator
{
public override bool GeneratesTemporaryValues => false;
public override Guid Next(EntityEntry _) => Guid.CreateVersion7();
}
Code: Select all
public class GuidV7Convention : IModelFinalizingConvention
{
public void ProcessModelFinalizing(IConventionModelBuilder modelBuilder, IConventionContext _)
{
foreach (var entityType in modelBuilder.Metadata.GetEntityTypes())
{
foreach (var property in entityType.GetProperties())
{
if (property.ClrType == typeof(Guid) && property.ValueGenerated == ValueGenerated.OnAdd)
{
property.SetValueGeneratorFactory((_, _) => new GuidV7ValueGenerator());
}
}
}
}
}
Code: Select all
public class MyDbContext(...) : DbContext
{
public DbSet Foos { get; set; } = null!;
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// ...
}
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
base.ConfigureConventions(configurationBuilder);
configurationBuilder.Conventions.Add(_ => new GuidV7Convention());
}
}
Alle meine Entitäten haben jetzt v7-Guids, aber ist das der richtige Weg?