É ok para confiar em um try-catch em um método CreateOrUpdate para o Entity Framework?
-
22-07-2019 - |
Pergunta
É aceitável para fazer isso? Primeira tentativa ao adicionar a entidade. Se o suplemento falhar, não importa, porque isso significa que a entidade já existe?
Ou há uma solução mais elegante / fácil?
EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();
try
{
dal.AddToXXXXXX(xxxxxxx);
}
catch
{
}
try
{
dal.SaveChanges();
return true;
}
catch
{
return false;
}
OK I encurtado para ...
EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();
if(xxxxxxx.ID == 0)
{
dal.AddToXXXXXX(xxxxxxx);
}
try
{
dal.SaveChanges();
return true;
}
catch
{
return false;
}
Solução
É certamente não OK para fazer isso. Uma indicação do prendedor com nenhum tipo em C meio # "capturar qualquer padrão ou exceção não-padrão". Mas você é a intenção é evitar que um Add duplicado. Adiciona pode falhar por uma variedade de razões que não são indicativos de uma entrada existente. Por exemplo, esse método poderia jogar uma referência nula e você pode assumir que ele foi adicionado.
Se você quiser verificar se há um add duplicada, você deve captura somente a exceção que é lançada para um add duplicado.
Outras dicas
Você gostaria de começar com um método de estilo IfExists, e depois saltar salvar as alterações, a menos que você realmente tem alterações.
Como observado por Lucas, blocos try-catch têm uma grande sobrecarga se você cair no bloco catch, de modo geral, você não quer confiar em que a menos que não há maneira possível de determinar se o item já existe.
Não use um try-catch para fazer uma Se o trabalho de declaração. Try-catch é para eventos imprevistos incomuns.
Editar Em seu código atualizado, você está falhando para pegar uma exceção que seria jogado pelo método "AddToXXXXXX".
Você deve fazer
If(!XXXXXX.Contains(newItemValue))
{
try
{
add...
savechanges...
}
catch
{
}
}
Como alternativa, você pode separar o Add e savechanges em diferentes blocos try-catch, mas isso só é necessário se SaveChanges é executado mesmo quando Add falhar.
Você pode substituir o primeiro try-catch com um Se declaração, eu acho que você ainda vai querer a segunda embora.
Editar: também não é recomendado apenas para capturar todas as exceções em um bloco sem levar em conta o que são.
P.S. Tente blocos Catch usar mais poder de processamento (tempo) do que se declarações.