首页 > 解决方案 > npgsql 3.1 中的 ValueGenerator 工厂支持

问题描述

我正在尝试在 ADD 上实现一个自动生成的值,根据这个示例,它非常简单。问题是生成器方法永远不会被调用,所以我想知道 npgsql 是否只是缺乏对此的支持?

例子:

modelBuilder.Entity<Customer>(entity =>
{
 
  entity.Property(e => e.AccountNumber)
    .ValueGeneratedOnAdd()
    .HasValueGenerator<AccountGenerator>();
 
});
public class AccountGenerator : ValueGenerator<string>
  {
    public override bool GeneratesTemporaryValues => false;

    private string NextAccountNumber()
    {
         .....
         return "some generated string";
    }

    public override string Next(EntityEntry entry) => NextAccountNumber();

标签: npgsqlef-core-3.1

解决方案


Npgsql 像其他 EF Core 提供程序一样支持值生成器 - 但您需要发布完全可运行的代码示例而不是片段。下面的代码工作并插入“一些生成的字符串”。

await using var ctx = new BlogContext();
await ctx.Database.EnsureDeletedAsync();
await ctx.Database.EnsureCreatedAsync();

ctx.Customers.Add(new());
await ctx.SaveChangesAsync();

public class BlogContext : DbContext
{
    public DbSet<Customer> Customers { get; set; }

    static ILoggerFactory ContextLoggerFactory
        => LoggerFactory.Create(b => b.AddConsole().AddFilter("", LogLevel.Information));

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
            .UseNpgsql(@"Host=localhost;Username=test;Password=test")
            .EnableSensitiveDataLogging()
            .UseLoggerFactory(ContextLoggerFactory);

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Customer>().Property(e => e.AccountNumber)
            .ValueGeneratedOnAdd()
            .HasValueGenerator<AccountGenerator>();
    }
}

public class Customer
{
    public int Id { get; set; }
    public string AccountNumber { get; set; }
}

public class AccountGenerator : ValueGenerator<string>
{
    public override bool GeneratesTemporaryValues => false;
    public override string Next(EntityEntry entry) => "some generated string";
}

推荐阅读