Table of Contents

Other

PostgreSQL extensions

The Npgsql EF Core provider allows you to specify PostgreSQL extensions that should be set up in your database. Simply use HasPostgresExtension in your context's OnModelCreating method:

protected override void OnModelCreating(ModelBuilder modelBuilder)
    => modelBuilder.HasPostgresExtension("hstore");

Execution Strategy

The Npgsql EF Core provider provides a retrying execution strategy, which will attempt to detect most transient PostgreSQL/network errors and will automatically retry your operation. To enable, place the following code in your context's OnModelConfiguring:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.UseNpgsql(
        "<connection_string>",
        options => options.EnableRetryOnFailure());

This strategy relies on the IsTransient property of NpgsqlException.

Certificate authentication

The Npgsql allows you to provide a callback for verifying the server-provided certificates, and to provide a callback for providing certificates to the server. The latter, if properly set up on the PostgreSQL side, allows you to do client certificate authentication - see the Npgsql docs and also the PostgreSQL docs on setting this up.

The Npgsql EF Core provider allows you to set these two callbacks on the DbContextOptionsBuilder as follows:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.UseNpgsql(
        "<connection_string>",
        options =>
        {
            options.RemoteCertificateValidationCallback(MyCallback1);
            options.ProvideClientCertificatesCallback(MyCallback2);
        });

You may also consider passing Trust Server Certificate=true in your connection string to make Npgsql accept whatever certificate your PostgreSQL provides (useful for self-signed certificates).

Caution

When specifying the options via OnConfiguring, make sure that the callbacks you pass in are static methods. Passing in instance methods causes EF Core to create a new service provider for each context instance, which can degrade performance in a significant way.

CockroachDB Interleave In Parent

If you're using CockroachDB, the Npgsql EF Core provider exposes its "interleave in parent" feature. Use the following code:

protected override void OnModelCreating(ModelBuilder modelBuilder)
    => modelBuilder.Entity<Customer>()
                   .UseCockroachDbInterleaveInParent(
                        typeof(ParentEntityType),
                        new List<string> { "prefix_column_1", "prefix_column_2" });