Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Opzioni del database SQL di Azure
Note
È consigliabile usare il UseAzureSql metodo anziché UseSqlServer quando ci si connette ad Azure SQL.
Il database SQL di Azure offre un'ampia gamma di opzioni di determinazione dei prezzi in genere configurate tramite il portale di Azure. Tuttavia, se si gestisce lo schema usando le migrazioni di EF Core, è possibile configurare le opzioni desiderate con Entity Framework e verranno applicate quando EF crea il database.
È possibile specificare il livello di servizio del database (EDITION) usando HasServiceTier:
modelBuilder.HasServiceTier("BusinessCritical");
È possibile specificare le dimensioni massime del database usando HasDatabaseMaxSize:
modelBuilder.HasDatabaseMaxSize("2 GB");
È possibile specificare il livello di prestazioni del database (SERVICE_OBJECTIVE) usando HasPerformanceLevel:
modelBuilder.HasPerformanceLevel("BC_Gen4_1");
Usare HasPerformanceLevelSql per configurare il pool elastico, poiché il valore non è un valore letterale stringa:
modelBuilder.HasPerformanceLevelSql("ELASTIC_POOL ( name = myelasticpool )");
Tip
Tutti i valori supportati sono disponibili nella documentazione di ALTER DATABASE.
SaveChanges, trigger e clausola OUTPUT
Quando EF Core salva le modifiche al database, questa operazione viene eseguita con una tecnica ottimizzata usando la clausola T-SQL OUTPUT. Sfortunatamente, la clausola OUTPUT presenta alcune limitazioni; in particolare non può essere usato con tabelle con trigger, ad esempio.
Se si verifica una limitazione relativa all'uso della clausola OUTPUT, è possibile disabilitarla in una tabella specifica tramite UseSqlOutputClause:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.ToTable(tb => tb.UseSqlOutputClause(false));
}
In questo modo Entity Framework passerà a una tecnica meno recente e meno efficiente per aggiornare la tabella.
Se la maggior parte o tutte le tabelle dispongono di trigger, è possibile configurare questa opzione per tutte le tabelle del modello usando la convenzione di compilazione del modello seguente:
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);
}
}
}
}
Questa operazione chiama UseSqlOutputClause automaticamente su tutte le tabelle del modello, invece di doverla eseguire manualmente per ogni singola tabella.