Compartilhar via


Notas diversas para o SQL Server

Opções do banco de dados SQL do Azure

Note

Você deve usar o UseAzureSql método em vez de UseSqlServer ao conectar-se ao Azure SQL.

O Banco de Dados SQL do Azure fornece uma variedade de opções de preços que geralmente são configuradas por meio do Portal do Azure. No entanto, se você estiver gerenciando o esquema usando migrações do EF Core, poderá configurar as opções desejadas com o EF e elas serão aplicadas quando o EF criar o banco de dados.

Você pode especificar a camada de serviço do banco de dados (EDITION) usando HasServiceTier:

modelBuilder.HasServiceTier("BusinessCritical");

Você pode especificar o tamanho máximo do banco de dados usando HasDatabaseMaxSize:

modelBuilder.HasDatabaseMaxSize("2 GB");

Você pode especificar o nível de desempenho do banco de dados (SERVICE_OBJECTIVE) usando HasPerformanceLevel:

modelBuilder.HasPerformanceLevel("BC_Gen4_1");

Use HasPerformanceLevelSql para configurar o pool elástico, já que o valor não é um literal de cadeia de caracteres:

modelBuilder.HasPerformanceLevelSql("ELASTIC_POOL ( name = myelasticpool )");

Tip

Você pode encontrar todos os valores com suporte na documentação ALTER DATABASE.

SaveChanges, gatilhos e a cláusula OUTPUT

Quando o EF Core salva alterações no banco de dados, ele faz isso com uma técnica otimizada usando a cláusula T-SQL OUTPUT. Infelizmente, a cláusula OUTPUT tem algumas limitações; notavelmente não pode ser usado com tabelas que têm gatilhos, por exemplo.

Se você encontrar uma limitação relacionada ao uso da cláusula OUTPUT, poderá desabilitá-la em uma tabela específica por meio de UseSqlOutputClause:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .ToTable(tb => tb.UseSqlOutputClause(false));
}

Isso fará com que o EF mude para uma técnica mais antiga e menos eficiente para atualizar a tabela.

Se a maioria ou todas as tabelas tiverem gatilhos, você poderá configurar isso para todas as tabelas do modelo usando a seguinte convenção de criação de modelo:

public class NoOutputClauseConvention : IModelFinalizingConvention
{
    public virtual void ProcessModelFinalizing(
        IConventionModelBuilder modelBuilder,
        IConventionContext<IConventionModelBuilder> context)
    {
        foreach (var entityType in modelBuilder.Metadata.GetEntityTypes())
        {
            var table = StoreObjectIdentifier.Create(entityType, StoreObjectType.Table);
            if (table is not null)
            {
                entityType.Builder.UseSqlOutputClause(false);
            }

            foreach (var fragment in entityType.GetMappingFragments(StoreObjectType.Table))
            {
                entityType.Builder.UseSqlOutputClause(false, fragment.StoreObject);
            }
        }
    }
}

Isso efetivamente chama UseSqlOutputClause todas as tabelas do modelo, em vez de você precisar fazer isso manualmente para cada tabela.