Я хочу заменить все Guid.NewGuid() в столбцах ID моей базы данных на версия 7, поставляемая с .NET 9: Guid.CreateVersion7().
EF Core, похоже, не предоставляет готового способа сделать это, поэтому я реализовал собственный решение.
Однако я не могу найти способ сделать это в EF Core «из коробки».
Решение, которое я нашел есть работы, но я не уверен, что это лучший вариант (или даже хороший).
Вот что я сделал:
< ol>
[*]Создайте собственный генератор значений для руководств v7.
[*]Создайте собственное соглашение, использующее собственный генератор
[*]Зарегистрируйте это соглашение глобально в EF Core
Шаг 1:
Код: Выделить всё
public class GuidV7ValueGenerator : ValueGenerator
{
public override bool GeneratesTemporaryValues => false;
public override Guid Next(EntityEntry _) => Guid.CreateVersion7();
}
Код: Выделить всё
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());
}
}
}
}
}
Код: Выделить всё
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());
}
}
Все мои объекты теперь имеют руководства v7, но так ли это?
Подробнее здесь: https://stackoverflow.com/questions/793 ... in-ef-core
Мобильная версия