title: Specify Azure SQL server edition in EF Core without breaking local development
body: <p>Entity Framework Core introduced the methods <a href="https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.sqlservermodelbuilderextensions.hasservicetier?view=efcore-3.1" rel="noreferrer">HasServiceTier</a> and <a href="https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.sqlservermodelbuilderextensions.hasperformancelevel?view=efcore-3.1" rel="noreferrer">HasPerformanceLevel</a> to change the edition of an Azure SQL server. You can use them in <a href="https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.dbcontext.onmodelcreating?view=entity-framework-6.2.0" rel="noreferrer">OnModelCreating</a> like this:</p>
  
  <pre><code>protected override void OnModelCreating(ModelBuilder modelBuilder)
  {
      base.OnModelCreating(modelBuilder);
  
      modelBuilder.HasServiceTier("Basic");
      modelBuilder.HasPerformanceLevel("Basic");
  }
  </code></pre>
  
  <p>If you use Add-Migration <a href="https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=vs#create-a-migration" rel="noreferrer">Add-Migration</a> you get a migration like this:</p>
  
  <pre><code>public partial class ChangedDatabaseServiceTierToBasic : Migration
  {
      protected override void Up(MigrationBuilder migrationBuilder)
      {
          migrationBuilder.AlterDatabase()
              .Annotation("SqlServer:EditionOptions", "EDITION = 'Basic', SERVICE_OBJECTIVE = 'Basic'");
      }
  
      protected override void Down(MigrationBuilder migrationBuilder)
      {
          migrationBuilder.AlterDatabase()
              .OldAnnotation("SqlServer:EditionOptions", "EDITION = 'Basic', SERVICE_OBJECTIVE = 'Basic'");
      }
  }
  </code></pre>
  
  <p>This seems to work fine but when I try to apply this migration to a local non-Azure DB for development purposes I get the following error:</p>
  
  <pre><code>Microsoft.EntityFrameworkCore.Migrations[20402]
        Applying migration '20200413102908_ChangedDatabaseServiceTierToBasic'.
  Applying migration '20200413102908_ChangedDatabaseServiceTierToBasic'.
  fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
        Failed executing DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
        BEGIN
        DECLARE @db_name NVARCHAR(MAX) = DB_NAME();
        EXEC(N'ALTER DATABASE ' + @db_name + ' MODIFY ( 
        EDITION = ''Basic'', SERVICE_OBJECTIVE = ''Basic'' );');
        END
  Failed executing DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
  BEGIN
  DECLARE @db_name NVARCHAR(MAX) = DB_NAME();
  EXEC(N'ALTER DATABASE ' + @db_name + ' MODIFY ( 
  EDITION = ''Basic'', SERVICE_OBJECTIVE = ''Basic'' );');
  END
  Microsoft.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near '.'.
     at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
     at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
     at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
     at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean&amp; dataReady)
     at Microsoft.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean isAsync, Int32 timeout, Boolean asyncWrite)
     at Microsoft.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean&amp; usedCache, Boolean asyncWrite, Boolean inRetry, String methodName)
     at Microsoft.Data.SqlClient.SqlCommand.ExecuteNonQuery()
     at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject)
     at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
     at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection)
     at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
     at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
     at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String contextType)
     at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.&lt;&gt;c__DisplayClass0_0.&lt;.ctor&gt;b__0()
     at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
  ClientConnectionId:d9f92b81-9916-48ee-9686-6d0f567ab86f
  Error Number:102,State:1,Class:15
  Incorrect syntax near '.'.
  </code></pre>
  
  <p>I assume the commands are not valid for non-Azure DBs. So the question is: How can I prevent these commands to be executed on non-Azure DBs?</p>