Increase Command Timeout for EF Core Migration Bundles

Increase Command Timeout for EF Core Migration Bundles

Increase Command Timeout for EF Core Migration Bundles

EF Core Migration Bundles are standalone executable files that contain one or more Entity Framework Core migrations and can be applied directly to a database. They are particularly useful for deploying migrations independently of the source code or development environment, e.g. in production environments.
Using migration bundles simplifies the deployment process as no additional software or configuration is required to perform the migrations. In CI/CD systems like Azure DevOps in particular, they can be executed across all platforms on all operating systems and therefore offer a flexible alternative to DACPAC deployments, which are often dependent on Windows tooling.

The inadequate documentation

A very big disadvantage of EF Migration Bundles is the documentation. Even for years there has been virtually no documentation or working examples - so you have to try out a lot. This is also the case here.

The command timeout

If a migration takes longer than 30 seconds - which is the standard - this is acknowledged by an exception during deployment. In the case of MSSQL, this looks like this:

Microsoft.Data.SqlClient.SqlException (0x80131904): Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

Unfortunately, the exact timeout is not specified here - but it is the command timeout. The error message in conjunction with MySQL is slightly better here.

MySql.Data.MySqlClient.MySqlException (0x80004005): The Command Timeout expired before the operation completed.

The best way to increase the command timeout is directly via the connection string; in the case of MSSQL via Command Timeout=xyz, where xyz is a number representing the seconds.

Together with Azure DevOps Pipeline YAML, a complete example with 600 seconds timeout (10 minutes) looks like this:

- task: AzureCLI@2
  displayName: Azure SQL Schema Deployment
  inputs:
    azureSubscription: ${{ parameters.azureConnectionName }}
    scriptType: pscore
    scriptLocation: inlineScript
    inlineScript: |
      chmod +x ${{ variables.STAGE_SQL_BUNDLE_PATH}}/my-linux-bundle
      ${{ variables.STAGE_SQL_BUNDLE_PATH}}/my-linux-bundle `
      --connection 'Server=${{ variables.STAGE_SQL_SERVER }};Database=${{ variables.STAGE_SQL_DBNAME }};Authentication=Active Directory Default;Command Timeout=600'