- 1 - Configurando log simplificado
- 2 - Filtrado categoria de log
- 3 - Escrevendo log em um arquivo
- 4 - Habilitando erros detalhados
- 5 - Habilitando visualização dos dados sensíveis
- 6 - Configurando o batch size
- 7 - Configurando o timeout do comando global
- 8 - Configurando o timeout para um comando para um fluxo
- 9 - Confgurando resiliência para sua aplicação
- 10 - Criando uma estratégia de resiliência
optionsBuilder
.UseSqlServer(stringDeConexao)
// Gerar um log com tudo o que esta contecendo
//.LogTo(Console.WriteLine)
// Gera os log somente informativos
.LogTo(Console.WriteLine, LogLevel.Information)
;
Namespace responsavel: Microsoft.EntityFrameworkCore.Diagnostics
optionsBuilder
.UseSqlServer(stringDeConexao)
.LogTo(Console.WriteLine,
// Filtro de eventos
new[] {CoreEventId.ContextInitialized, RelationalEventId.CommandExecuted},
// log level
LogLevel.Information,
// options -> Data hora e em uma unica linha
DbContextLoggerOptions.LocalTime | DbContextLoggerOptions.SingleLine
)
;
private readonly StreamWriter _writer = new StreamWriter("log_ef.txt", true);
optionsBuilder
.UseSqlServer(stringDeConexao)
.EnableSensitiveDataLogging()
.LogTo(_writer.WriteLine)
;
public override void Dispose()
{
base.Dispose();
_writer.Dispose();
}
Mudei o tipo da propriedade Departamento.Ativo de booleando para int.
Erro gerado:
# Unhandled exception. System.InvalidCastException: Unable to cast object of type 'System.Boolean' to type 'System.Int32'.
Para habilitar erros mais detalhados: Use somente em ambiente de dev
optionsBuilder
.UseSqlServer(stringDeConexao)
// Gera um erro mais detalhado facilitando a manutenção dos erros
.EnableDetailedErrors()
;
Output do erro depois de habilitar o erro detalhado:
# Unhandled exception. System.InvalidOperationException: An error occurred while reading a database value for property 'Departamento.Ativo'. The expected type was 'System.Int32' but the actual value was of type 'System.Boolean'.
# ---> System.InvalidCastException: Unable to cast object of type 'System.Boolean' to type 'System.Int32'.
Usar somente em ambiente de dev
optionsBuilder
.UseSqlServer(stringDeConexao)
.EnableSensitiveDataLogging();
Tamanho limite padrão é 42
optionsBuilder
.UseSqlServer(stringDeConexao, x => x.MaxBatchSize(50))
.EnableSensitiveDataLogging()
.LogTo(Console.WriteLine, LogLevel.Information)
;
optionsBuilder
.UseSqlServer(stringDeConexao, x => x
.MaxBatchSize(50)
.CommandTimeout(5) // 5 segundos
)
.EnableSensitiveDataLogging()
.LogTo(Console.WriteLine, LogLevel.Information);
// forçando um erro
db.Database.ExecuteSqlRaw("WAITFOR DELAY '00:00:07' ;SELECT 1");
db.Database.SetCommandTimeout(10);
db.Database.ExecuteSqlRaw("WAITFOR DELAY '00:00:07' ;SELECT 1");
optionsBuilder
.UseSqlServer(stringDeConexao, x => x
.MaxBatchSize(50)
.CommandTimeout(5)
.EnableRetryOnFailure(4, TimeSpan.FromSeconds(10), null)
)
Cenário: Ocorrera um erro de rede logo após efetuar o SaveChanges. Como esta configurado o RetryOnFailure, o EF tentara executar novamente o SaveChange e com isso poderá salvar dados duplicados. O código abaixo é uma estrategia para evitar isso.
using var db = new ApplicationContext();
var strategy = db.Database.CreateExecutionStrategy();
strategy.Execute(() =>
{
using var transaction = db.Database.BeginTransaction();
db.Departamentos.Add(new Departamento {Descricao = "Departament transação"});
db.SaveChanges();
transaction.Commit();
});