Bagikan melalui


Catatan lain-lain untuk SQL Server

Opsi Azure SQL database

Note

Anda harus menggunakan UseAzureSql metode alih-alih UseSqlServer saat menyambungkan ke Azure SQL.

Azure SQL Database menyediakan berbagai opsi harga yang biasanya dikonfigurasi melalui Portal Microsoft Azure. Namun, jika Anda mengelola skema menggunakan migrasi EF Core, Anda dapat mengonfigurasi opsi yang diinginkan dengan EF, dan mereka akan diterapkan saat EF membuat database.

Anda dapat menentukan tingkat layanan database (EDISI) menggunakan HasServiceTier:

modelBuilder.HasServiceTier("BusinessCritical");

Anda dapat menentukan ukuran maksimum database menggunakan HasDatabaseMaxSize:

modelBuilder.HasDatabaseMaxSize("2 GB");

Anda dapat menentukan tingkat performa database (SERVICE_OBJECTIVE) menggunakan HasPerformanceLevel:

modelBuilder.HasPerformanceLevel("BC_Gen4_1");

Gunakan HasPerformanceLevelSql untuk mengonfigurasi kumpulan elastis, karena nilainya bukan string literal:

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

Tip

Anda dapat menemukan semua nilai yang didukung dalam dokumentasi ALTER DATABASE.

SaveChanges, pemicu, dan klausa OUTPUT

Ketika EF Core menyimpan perubahan pada database, EF Core melakukannya dengan teknik yang dioptimalkan menggunakan klausa T-SQL OUTPUT. Sayangnya, klausul OUTPUT memiliki beberapa batasan; ini terutama tidak dapat digunakan dengan tabel yang memiliki pemicu, misalnya.

Jika Anda mengalami batasan yang terkait dengan penggunaan klausul OUTPUT, Anda dapat menonaktifkannya pada tabel tertentu melalui UseSqlOutputClause:

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

Melakukan ini akan membuat EF beralih ke teknik yang lebih lama dan kurang efisien untuk memperbarui tabel.

Jika sebagian besar atau semua tabel Anda memiliki pemicu, Anda dapat mengonfigurasi ini untuk semua tabel model Anda dengan menggunakan konvensi pembuatan model berikut:

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

Ini secara efektif memanggil UseSqlOutputClause pada semua tabel dalam model Anda, alih-alih Anda harus melakukannya secara manual untuk masing-masing tabel.