Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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.