Dela via


Diverse anteckningar för SQL Server

Azure SQL-databasalternativ

Note

Du bör använda UseAzureSql metoden i stället för UseSqlServer när du ansluter till Azure SQL.

Azure SQL Database innehåller en mängd olika prisalternativ som vanligtvis konfigureras via Azure-portalen. Men om du hanterar schemat med hjälp av EF Core-migreringar kan du konfigurera önskade alternativ med EF, och de tillämpas när EF skapar databasen.

Du kan ange tjänstnivån för databasen (EDITION) med hjälp av HasServiceTier:

modelBuilder.HasServiceTier("BusinessCritical");

Du kan ange den maximala storleken på databasen med HasDatabaseMaxSize:

modelBuilder.HasDatabaseMaxSize("2 GB");

Du kan ange databasens prestandanivå (SERVICE_OBJECTIVE) med HasPerformanceLevel:

modelBuilder.HasPerformanceLevel("BC_Gen4_1");

Använd HasPerformanceLevelSql för att konfigurera den elastiska poolen eftersom värdet inte är en strängliteral:

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

Tip

Du hittar alla värden som stöds i ALTER DATABASE-dokumentationen.

SaveChanges, utlösare och OUTPUT-klausulen

När EF Core sparar ändringar i databasen gör den det med en optimerad teknik med hjälp av T-SQL OUTPUT-satsen. Tyvärr har OUTPUT-satsen vissa begränsningar. Det kan inte användas särskilt med tabeller som har utlösare, till exempel.

Om du stöter på en begränsning som rör användningen av OUTPUT-satsen kan du inaktivera den i en specifik tabell via UseSqlOutputClause:

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

Detta gör att EF byter till en äldre, mindre effektiv teknik för att uppdatera tabellen.

Om de flesta eller alla tabeller har utlösare kan du konfigurera detta för alla din modells tabeller med hjälp av följande modellbyggkonvention:

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);
            }
        }
    }
}

Detta anropar UseSqlOutputClause effektivt på alla dina modelltabeller, istället för att du måste göra det manuellt för var och en av tabellerna.