Conditional logic
Choose between inspecting the live schema and declaring a provider-specific operation.
Examples use Classic and Fluent tabs. Your choice follows you through the manual.
Provider-specific operations
The Classic provider indexer selects a named provider or a no-op provider. Fluent IfProvider wraps structured operations in a provider condition. Use the provider names understood by the dialect; this SQLite example leaves other providers unchanged.
Classic
Database["SQLite"].ExecuteNonQuery("UPDATE Users SET Name = upper(Name)");Fluent
migration.IfProvider("SQLite", sqlite =>
sqlite.Execute.Sql("UPDATE Users SET Name = upper(Name)"));Inside Up() / BuildUp(MigrationBuilder migration)
Schema-dependent decisions
Use Database.TableExists/ColumnExists or FluentMigration.Schema for connected checks. These inspect the current database. A fluent BuildUp method collects operations before they execute, so queued creation is not visible to a live metadata read in the same method.
For execution-time decisions after earlier operations, use an explicit provider callback. That callback cannot be previewed and requires an authored reverse. Avoid making a migration silently succeed with the wrong schema: an existence check alone does not validate a column’s type or constraint definition.