다음을 통해 공유


SQL Server에 대한 기타 참고 사항

Azure SQL 데이터베이스 옵션

Note

Azure SQL에 연결할 때는 UseAzureSql 대신 .

Azure SQL Database는 일반적으로 Azure Portal을 통해 구성된 다양한 가격 책정 옵션을 제공합니다. 그러나 EF Core 마이그레이션을 사용하여 스키마를 관리하는 경우 EF를 사용하여 원하는 옵션을 구성할 수 있으며 EF가 데이터베이스를 만들 때 적용됩니다.

HasServiceTier를 사용하여 데이터베이스(EDITION)의 서비스 계층을 지정할 수 있습니다.

modelBuilder.HasServiceTier("BusinessCritical");

HasDatabaseMaxSize를 사용하여 데이터베이스의 최대 크기를 지정할 수 있습니다.

modelBuilder.HasDatabaseMaxSize("2 GB");

HasPerformanceLevel을 사용하여 데이터베이스의 성능 수준(SERVICE_OBJECTIVE)을 지정할 수 있습니다.

modelBuilder.HasPerformanceLevel("BC_Gen4_1");

값이 문자열 리터럴이 아니므로 HasPerformanceLevelSql 을 사용하여 탄력적 풀을 구성합니다.

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

Tip

ALTER DATABASE 설명서에서 지원되는 모든 값을 찾을 수 있습니다.

SaveChanges, 트리거 및 OUTPUT 절

EF Core가 데이터베이스에 변경 내용을 저장하면 T-SQL OUTPUT 절을 사용하여 최적화된 기술로 변경합니다. 아쉽게도 OUTPUT 절에는 몇 가지 제한 사항이 있습니다. 예를 들어 트리거가 있는 테이블에는 특히 사용할 수 없습니다.

OUTPUT 절 사용과 관련된 제한 사항이 발생하면 다음을 통해 UseSqlOutputClause특정 테이블에서 사용하지 않도록 설정할 수 있습니다.

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

이렇게 하면 EF가 테이블을 업데이트하는 데 덜 효율적인 이전 기술로 전환됩니다.

대부분의 테이블 또는 모든 테이블에 트리거가 있는 경우 다음 모델 빌드 규칙을 사용하여 모든 모델의 테이블에 대해 이를 구성할 수 있습니다.

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

이렇게 하면 각 테이블에 대해 수동으로 수행하는 대신 모델의 모든 테이블을 효과적으로 UseSqlOutputClause 호출할 수 있습니다.