Pregunta

¿Es aceptable hacer esto? Primero intente agregar la entidad. Si el complemento falla, ¿no importa porque eso significa que la entidad ya existe?

¿O hay una solución más elegante / fácil?

EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();

try
{
    dal.AddToXXXXXX(xxxxxxx);
}
catch
{

}

try
{
    dal.SaveChanges();
    return true;
}
catch
{
    return false;
}

OK, lo acorté a ...

EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();

if(xxxxxxx.ID == 0)
{
    dal.AddToXXXXXX(xxxxxxx);
}

try
{
    dal.SaveChanges();
    return true;
}
catch
{
    return false;
}
¿Fue útil?

Solución

Ciertamente no está bien hacer esto. Una declaración catch sin tipo en C # significa "capturar cualquier excepción estándar o no estándar". Pero su intención es evitar un Add duplicado. Las adiciones pueden fallar por una variedad de razones que no son indicativas de una entrada existente. Por ejemplo, ese método podría arrojar una referencia nula y supondría que se agregó.

Si desea buscar un complemento duplicado, debe capturar solo la excepción que se produce para un complemento duplicado.

Otros consejos

Debería comenzar con un método de estilo IfExists, y luego omitir guardar sus cambios a menos que realmente tenga cambios.

Como señaló Lucas, los bloques try-catch tienen una gran sobrecarga si cae en el bloque catch, por lo que generalmente no desea confiar en eso a menos que no haya una forma posible de determinar si el elemento ya existe.

No use un try-catch para hacer el trabajo de una instrucción If. Try-catch es para eventos inesperados inesperados.

EDITAR En su código actualizado, no puede detectar una excepción que se generaría mediante el " AddToXXXXXX " método.

Deberías hacer

If(!XXXXXX.Contains(newItemValue))
{
   try
   {
      add...
      savechanges...
   }
   catch
   {

   }
}

alternativamente, puede separar los cambios Agregar y Guardar en diferentes bloques try-catch, pero eso solo es necesario si SaveChanges se ejecuta incluso cuando falla Agregar.

Podrías reemplazar el primer Try-Catch con una declaración If, aunque creo que aún querrás el segundo.

Editar: Tampoco se recomienda capturar todas las excepciones en un bloque sin tener en cuenta cuáles son.

P.S. Pruebe Los bloques de captura usan más potencia de procesamiento (tiempo) que las declaraciones If.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top