Aracılığıyla paylaş


SQL Server için çeşitli notlar

Azure SQL veritabanı seçenekleri

Note

Azure SQL'e UseAzureSql bağlanmak yerine gerekir.

Azure SQL Veritabanı, genellikle Azure Portal aracılığıyla yapılandırılan çeşitli fiyatlandırma seçenekleri sağlar. Ancak, şemayı EF Core geçişlerini kullanarak yönetiyorsanız, EF ile istediğiniz seçenekleri yapılandırabilirsiniz ve EF veritabanını oluşturduğunda bunlar uygulanır.

HasServiceTier kullanarak veritabanının hizmet katmanını (EDITION) belirtebilirsiniz:

modelBuilder.HasServiceTier("BusinessCritical");

HasDatabaseMaxSize kullanarak veritabanının en büyük boyutunu belirtebilirsiniz:

modelBuilder.HasDatabaseMaxSize("2 GB");

HasPerformanceLevel kullanarak veritabanının performans düzeyini (SERVICE_OBJECTIVE) belirtebilirsiniz:

modelBuilder.HasPerformanceLevel("BC_Gen4_1");

HasPerformanceLevelSql kullanarak elastik havuzu yapılandırın, çünkü değer bir metin sabiti değildir:

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

Tip

Desteklenen tüm değerleri ALTER DATABASE belgelerinde bulabilirsiniz.

SaveChanges, tetikleyiciler ve OUTPUT ifadesi

EF Core değişiklikleri veritabanına kaydettiğinde, bunu T-SQL OUTPUT yan tümcesini kullanarak iyileştirilmiş bir teknikle yapar. Ne yazık ki OUTPUT yan tümcesinin bazı sınırlamaları vardır; özellikle tetikleyicileri olan tablolarla kullanılamaz, örneğin.

OUTPUT yan tümcesinin kullanımıyla ilgili bir sınırlamayla karşılaşırsanız, belirli bir tabloda UseSqlOutputClause komutunu kullanarak devre dışı bırakabilirsiniz.

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

Bunun yapılması, EF'nin tabloyu güncelleştirmek için daha eski ve daha az verimli bir teknikle geçiş yapmasını sağlar.

Tablolarınızın çoğunun veya tümünün tetikleyicileri varsa, aşağıdaki model oluşturma kuralını kullanarak bunu modelinizin tüm tabloları için yapılandırabilirsiniz:

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

Bu, her tablo için manuel olarak yapmak zorunda kalmak yerine, modelinizdeki tüm tablolar için UseSqlOutputClause işlevini otomatik olarak çağırır.