PostgreSQL
Native intervals, schema-aware metadata, transactional DDL and advisory locks.
Examples use Classic and Fluent tabs. Your choice follows you through the manual.
Connect with Npgsql
Use ProviderTypes.PostgreSQL and an open Npgsql connection, with the intended default schema. Connection search_path affects unqualified relation lookup. Metadata readers resolve the requested relation through PostgreSQL and distinguish same-named tables in different schemas.
Use native interval values
PostgreSQL maps duration values to native intervals. Time without time zone maps to a time of day; use TimeOnly for that input. Parameter mappings and scalar CLR return types are separate concerns: raw ADO.NET values remain driver-specific.
Classic
Database.AddColumn("Jobs", new Column("Elapsed", MigratorDbType.Interval)
{
DefaultValue = TimeSpan.FromDays(2)
});Fluent
migration.Create.Column("Elapsed").OnTable("Jobs").OfType(MigratorDbType.Interval)
.WithDefaultValue(TimeSpan.FromDays(2));Inside Up() / BuildUp(MigrationBuilder migration)
Collations and schemas
Create any ICU nondeterministic collation explicitly, then select it with Collation.Named. Column rendering does not silently create shared collation objects. Binary maps to C; language and case semantics should use a specific installed name.
Schema-aware metadata does not establish complete qualification for every operation. Test quoted names and search-path behavior with your migration. Renaming a table retains its named constraints; avoid colliding names when recreating the old table.
Transactions and coordination
WholeSession is supported for verified transactional DDL, and DatabaseMigrationLock uses a session advisory lock. Statements that require special transaction treatment need a separate deployment design. Keep the connection stable while the lease is held.