Note varie per SQLite

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.