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.
SaveChanges e la clausola RETURNING
Quando EF Core salva le modifiche al database, viene eseguita con una tecnica ottimizzata usando la clausola SQL RETURNING. Sfortunatamente, la clausola RETURNING presenta alcune limitazioni; non può essere usato con tabelle virtuali o tabelle con determinati tipi di trigger, ad esempio.
Se si verifica una limitazione correlata all'uso della clausola RETURNING, è possibile disabilitarla in una tabella specifica tramite UseSqlReturningClause:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.ToTable(tb => tb.UseSqlReturningClause(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.UseSqlReturningClause(false);
}
foreach (var fragment in entityType.GetMappingFragments(StoreObjectType.Table))
{
entityType.Builder.UseSqlReturningClause(false, fragment.StoreObject);
}
}
}
}
Questa operazione chiama UseSqlReturningClause efficacemente su tutte le tabelle del modello, invece di doverlo eseguire manualmente per ciascuna tabella.