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;
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top