Různé poznámky pro SQLite

SaveChanges a klauzule RETURNING

Když EF Core uloží změny do databáze, provede to s optimalizovanou technikou pomocí klauzule SQL RETURNING. Klauzule RETURNING má bohužel určitá omezení; Nelze ji použít s virtuálními tabulkami nebo tabulkami s určitými typy triggerů, například.

Pokud narazíte na omezení týkající se použití klauzule RETURNING, můžete ho zakázat u konkrétní tabulky prostřednictvím UseSqlReturningClause:

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

Tím se ef přepne na starší a méně efektivní techniku pro aktualizaci tabulky.

Pokud většina nebo všechny tabulky obsahují triggery, můžete ho nakonfigurovat pro všechny tabulky modelu pomocí následující konvence vytváření modelu:

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

Tímto způsobem efektivně voláte UseSqlReturningClause na všechny tabulky vašeho modelu, místo abyste to museli dělat ručně pro každou jednotlivou tabulku.