Udostępnij przez


Różne uwagi dotyczące programu SQL Server

Opcje bazy danych Azure SQL Database

Note

Należy użyć UseAzureSql metody zamiast podczas nawiązywania UseSqlServer połączenia z usługą Azure SQL.

Usługa Azure SQL Database oferuje różne opcje cenowe , które są zwykle konfigurowane za pośrednictwem witryny Azure Portal. Jeśli jednak zarządzasz schematem przy użyciu migracji EF Core, możesz skonfigurować żądane opcje za pomocą programu EF i będą one stosowane podczas tworzenia bazy danych przez EF.

Warstwę usługi bazy danych (EDITION) można określić za pomocą HasServiceTier:

modelBuilder.HasServiceTier("BusinessCritical");

Maksymalny rozmiar bazy danych można określić przy użyciu polecenia HasDatabaseMaxSize:

modelBuilder.HasDatabaseMaxSize("2 GB");

Poziom wydajności bazy danych (SERVICE_OBJECTIVE) można określić przy użyciu polecenia HasPerformanceLevel:

modelBuilder.HasPerformanceLevel("BC_Gen4_1");

Użyj polecenia HasPerformanceLevelSql , aby skonfigurować pulę elastyczną, ponieważ wartość nie jest literałem ciągu:

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

Tip

Wszystkie obsługiwane wartości można znaleźć w dokumentacji ALTER DATABASE.

SaveChanges, triggers i klauzula OUTPUT

Gdy program EF Core zapisuje zmiany w bazie danych, robi to przy użyciu zoptymalizowanej techniki przy użyciu klauzuli T-SQL OUTPUT. Niestety, klauzula OUTPUT ma pewne ograniczenia; Nie można jej używać w szczególności z tabelami, które mają wyzwalacze, na przykład.

Jeśli wystąpi ograniczenie związane z użyciem klauzuli OUTPUT, możesz wyłączyć ją w określonej tabeli za pomocą polecenia UseSqlOutputClause:

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

Dzięki temu program EF przełączy się na starszą, mniej wydajną technikę aktualizowania tabeli.

Jeśli większość lub wszystkie tabele mają wyzwalacze, można to skonfigurować dla wszystkich tabel modelu przy użyciu następującej konwencji tworzenia modelu:

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

Skutecznie wywołuje UseSqlOutputClause na wszystkich tabelach modelu, zamiast wykonywać to ręcznie dla każdej tabeli.