Notes diverses pour SQLite

SauvegarderLesModifications et la clause RETURNING

Quand EF Core enregistre les modifications apportées à la base de données, elle le fait avec une technique optimisée à l’aide de la clause SQL RETURNING. Malheureusement, la clause RETURNING présente certaines limitations ; il ne peut pas être utilisé avec des tables virtuelles ou des tables avec certains types de déclencheurs, par exemple.

Si vous rencontrez une limitation liée à l’utilisation de la clause RETURNING, vous pouvez la désactiver sur une table spécifique via UseSqlReturningClause:

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

Pour ce faire, EF passe à une technique plus ancienne et moins efficace pour mettre à jour le tableau.

Si la plupart ou l’ensemble de vos tables ont des déclencheurs, vous pouvez le configurer pour toutes les tables de votre modèle à l’aide de la convention de création de modèle suivante :

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

Cela appelle UseSqlReturningClause efficacement toutes les tables de votre modèle, au lieu de devoir le faire manuellement pour chaque table.