All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
- Migration loader doesn't try to load profiles anymore (fixes #904)
- Avoid duplicate Dispose calls (fixes #901)
- The FluentMigrator.Console package doesn't depend on the FluentMigrator package, because it's already included
- New
IFilteringMigrationSource
to avoid unnecessary instantiations - New
IVersionTableMetaDataSourceItem
to specify multiple places to search for version table metadata dotnet-fm
andMigrate.exe
are now referencingFSharp.Core
which should ease the problems with F# (issue #883).- New configuration for types from assemblies (see below)
- #877: Connection specific information should be resolved as scoped
- #884: Embedded script cannot be found in assemblies on .NET Core
- #888: VersionTable not changed after upgrading to 3.0
- Query
IConfigurationRoot
for the connection string ifIConfiguration
couldn't be found
- #886: Using profiles in 3.x versions
- #892: Nullable types are not supported in MSBuild runner
- #890: OracleManaged Migrations fail with runtime Exceptions
Oracle plans to release a non-beta version of the driver in Q3, but
it's the only Oracle driver that works under Linux/MacOS. The console
tool (Migrate.exe
) is more Windows-centric and will therefore keep
using the standard Oracle ADO.NET library. The dotnet-fm
is mostly
used on non-Windows platforms and is therefore predestinated to use
the new beta driver.
The statement from Oracle can be found on the Oracle website.
The console tool will switch to the new driver when it becomes stable.
var services = new ServiceCollection()
.AddFluentMigratorCore()
.ConfigureRunner(rb => rb
.AddSQLite()
.ScanIn(typeof(YourType).Assembly));
// There is a fluent interface to configure the targets for ScanIn
Configurations for ScanIn(assemblies)
:
--+-------------------------------------------+->
| ^
| |
+- For -+- All() ---------------------------+
^ | ^
| | |
| +- Migrations() ------------+-->+-->+
| | ^ |
| | | |
| +- VersionTableMetaData() --+ |
| | ^ |
| | | |
| +- EmbeddedResources() -----+ |
| |
| v
+<--------------------------------------+
Example:
var services = new ServiceCollection()
.AddFluentMigratorCore()
.ConfigureRunner(rb => rb
.AddSQLite()
.ScanIn(typeof(YourType).Assembly)
.For.Migrations()
.For.EmbeddedResources());
// There is a fluent interface to configure the targets for ScanIn
This allows the reconfiguration of the connection string/used database at run-time.
- Connection string
- Processor/generator selection
- Type filters
The following option classes are now resolved using IOptionSnapshot<T>
:
ProcessorOptions
SelectingProcessorAccessorOptions
SelectingGeneratorAccessorOptions
TypeFilterOptions
The following services are now scoped instead of singleton:
IVersionTableMetaDataAccessor
IVersionTableMetaData
IMigrationSource
IMigrationInformationLoader
The MigrationSource
now consumes all registered IMigrationSourceItem
instances.
The new documentation is online on https://fluentmigrator.github.io.
- #850: Set minimum .NET Framework version to 4.6.1. Older versions aren't supported anymore.
ProcessorOptions.Timeout
is now of typeSystem.TimeSpan?
MigrationRunner.MaintenanceLoader
is now read-onlyMigrationRunner.CaughtExceptions
returns now aIReadOnlyList
dotnet-fm
is now a global tool and requires at least the .NET Core tooling 2.1-preview2
- #851: Enable the usage of Microsoft.Extensions.DependencyInjection
- #852: Replace custom configuration mechanisms by using Microsoft.Extensions.Options
- #853: Replace the announcer with Microsoft.Extensions.Logging
- Support for loading connection strings using a provided
IConfiguration
service (Microsoft.Extensions.Configuration) - #822:
IMigrationExpressionValidator
for custom migration expression validation - #809: Ability to add a schema owner during schema creation for SQL Server
- #767: Append
NULL
constraint for custom types for PostgreSQL and SQL Server
IAssemblyCollection
and all its implementationsIAnnouncer
and all its implementationsIMigrationRunnerConventions.GetMigrationInfo
IProfileLoader.ApplyProfiles()
IProfileLoader.FindProfilesIn
IMigrationProcessorOptions
IMigrationProcessorFactory
and all its implementationsIRunnerContext
andRunnerContext
, replaced by several dedicated options classes:RunnerOptions
are the newRunnerContext
(minus some properties extracted into separate option classes)ProcessorOptions
for global processor-specific optionsGeneratorOptions
to allow setting the compatibility modeTypeFilterOptions
for filtering migrations by namespaceAnnouncerOptions
to enable showing SQL statements and the elapsed timeSelectingProcessorAccessorOptions
allows selection of a processor by its identifierSelectingGeneratorAccessorOptions
allows selection of a generator by its identifierAppConfigConnectionStringAccessorOptions
to allow leading the connection strings from the *.config xml file (deprecated, only for transition toMicrosoft.Extensions.Configuration
)
CompatabilityMode
(is nowComatibilityMode
)ApplicationContext
in various interfaces/classesManifestResourceNameWithAssembly
replaced byValueTuple
MigrationGeneratorFactory
MigrationProcessorFactoryProvider
ITypeMap.GetTypeMap(DbType, int, int)
IDbFactory
: Only the implementations will remain- Several non-DI constructors
The library assumes that in ProcessorOptions.ConnectionString
is either a connection string or
a connection string identifier. This are the steps to load the real connection string.
- Queries all
IConnectionStringReader
implementations- When a connection string is returned by one of the readers, then this connection string will be used
- When no connection string is returned, try reading from the next
IConnectionStringReader
- When no reader returned a connection string, then return
ProcessorOptions.ConnectionString
The connection string stored in ProcessorOptions.ConnectionString
might be overridden
by registering the IConnectionStringReader
instance PassThroughConnectionStringReader
as scoped service.
When no connection string could be found, the SelectingProcessorAccessor
returns
a ConnectionlessProcessor
instead of the previously selected processor.
// Initialize the services
var serviceProvider = new ServiceCollection()
.AddLogging(lb => lb.AddFluentMigratorConsole())
.AddFluentMigratorCore()
.ConfigureRunner(
builder => builder
.AddSQLite()
.WithGlobalConnectionString(connectionString)
.WithMigrationsIn(typeof(AddGTDTables).Assembly))
.BuildServiceProvider();
// Instantiate the runner
var runner = serviceProvider.GetRequiredService<IMigrationRunner>();
// Run the migrations
runner.MigrateUp();
This adds the FluentMigrator services to the service collection and configures the runner to use SQLite with the given connection string, announcer and migration assembly.
Now you can instantiate the runner using the built service provider and use its functions.
- #856 New constructors to enable passing a custom expression convention set
- #859: The pound sign is only recognized when it's only preceeded by whitespace
- net452 build for the console runner to enable usage of the latest MySQL ADO.NET provider
- Added more ADO.NET providers for the console
- The tools are in platform-specific sub-directories again (e.g.
tools/net452/x86/Migrate.exe
)
This has become necessary to enable a better out-of-the-box experience for the migration tool.
Unlisted due to unintentional breaking change.
- #858: Don't even try to set the command timeout for SQL Server CE
- #856: Don't fail when an assembly couldn't be loaded
- #848:
MySql4ProcessorFactory
used theMySql5Generator
FluentMigrator.Console
now contains the migration tool in thetools/
directory
- Obsolete
FluentMigrator.Tools
package added as upgrade path
IQuerySchema.DatabaseType
now returnsSqlServer2016
, etc... and notSqlServer
any more- Database specific code was moved into its own assemblies
IMigrationConventions
was renamed toIMigrationRunnerConventions
IMigrationContext
doesn't contain theIMigrationConventions
any more- Expression conventions are now bundled in the new
IConventionSet
- Expression conventions are now bundled in the new
ICanBeConventional
was removed during the overhaul of the expression convention system- Strings are now Unicode by default. Use
NonUnicodeString
for ANSI strings FluentMigrator.Tools
was split into the following packagesFluentMigrator.Console
: TheMigrate.exe
toolFluentMigrator.MSBuild
: The MSBuildMigrate
task
- Framework: .NET Standard 2.0 support
- Database:
- SQL Anywhere 16 support
- SQL Server 2016 support
- MySQL:
ALTER/DROP DEFAULT
value support
- MySQL 5:
- New dialect
NVARCHAR
forAsString
- SQL Server 2005
WITH (ONLINE=ON/OFF)
support- 64 bit identity support
- Redshift (Amazon, experimental)
- Firebird
- New provider option:
Force Quote=true
to enforce quotes
- New provider option:
- All supported databases
- Streamlined table/index schema quoting
- Unique Constraints: Non-Distinct NULL support (SQL Server 2008 and SQL Anywhere 16)
- Types: DateTime2 support
- Dialect: SQLite foreign key support
- Insert/Update/Delete: DbNull support
- Expression:
- IfDatabase: Predicate support
- IfDatabase: Method delegation support
- Index: Creation with non-key columns
- Conventions: Default schema name support
SetExistingRowsTo
supportsSystemMethods
- Passing arguments to embedded SQL scripts
- Runner:
- TaskExecutor: HasMigrationsToApply support
- Case insensitive arguments support
StopOnError
flag
- Project:
- Moving database specific code from
FluentMigrator.Runner
toFluentMigrator.Runner.<Database>
- Extension methods for - e.g. SqlServer - are now in
FluentMigrator.Extensions.SqlServer
- Moving database specific code from
- Database:
- MySQL: Now announcing SQL scripts
- Runner:
- Better error messages
- ListMigrations: showing
(not applied)
for unapplied migrations - Show
(BREAKING)
for migrations with breaking changes - MSBuild task is available as separate package (with custom .targets file)
- Use provider default command timeout when no global timeout is set
- Generic:
IAnnouncer.Write
- Generic:
- Deprecated functions
- SchemaDump experiment
- T4 experiment
- Framework:
- .NET Framework 3.5 support
- Runner:
- NAnt build task
- Runner:
- Match
TagAttribute
by inheritance
- Match
- Processors (database specific processing of expressions):
- Using the new
SqlBatchParser
to parse batches of SQL statements (GO
statement support)
- Using the new
- Database:
- Hana: Fixed syntax for dropping a primary key
- Oracle: Table schema now added more consistently
- Tests:
- Mark integration tests as ignored when no active processor could be found