Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
SaveChanges e a cláusula RETORNO
Quando o EF Core guarda alterações na base de dados, faz-no com uma técnica otimizada usando a cláusula SQL RETURNING. Infelizmente, a cláusula RETURNING tem algumas limitações; não pode ser usado com tabelas virtuais ou tabelas com certos tipos de gatilho, por exemplo.
Se encontrar uma limitação relacionada com o uso da cláusula RETURNING, pode desativá-la numa tabela específica utilizando UseSqlReturningClause.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.ToTable(tb => tb.UseSqlReturningClause(false));
}
Fazer isto fará com que o EF mude para uma técnica mais antiga e menos eficiente para atualizar a tabela.
Se a maioria ou todas as suas tabelas tiverem triggers, pode configurar isto para todas as tabelas do seu modelo usando a seguinte convenção de construção de modelos:
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);
}
}
}
}
Isto chama efetivamente UseSqlReturningClause em todas as tabelas do seu modelo, em vez de ter de o fazer manualmente para cada uma delas.