Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.