Question

Est-ce acceptable de faire cela? Essayez d'abord d'ajouter l'entité. Si l'ajout échoue, cela n'a pas d'importance, car cela signifie que l'entité existe déjà?

Ou existe-t-il une solution plus élégante / plus simple?

EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();

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

}

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

OK je l'ai raccourci à ...

EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();

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

try
{
    dal.SaveChanges();
    return true;
}
catch
{
    return false;
}
Était-ce utile?

La solution

Ce n'est certainement pas OK pour le faire. Une instruction catch sans type en C # signifie "attraper toute exception standard ou non standard". Mais votre intention est d'empêcher un doublon Ajouter. Les ajouts peuvent échouer pour diverses raisons qui ne sont pas indicatives d’une entrée existante. Par exemple, cette méthode peut générer une référence null et vous supposez qu’elle a été ajoutée.

Si vous souhaitez rechercher un ajout en double, vous devez capturer uniquement l'exception qui est générée pour un ajout en double.

Autres conseils

Vous voudriez commencer par une méthode de style IfExists, puis ignorer l'enregistrement de vos modifications, à moins que vous n'ayez réellement des modifications.

Comme Lucas l'a noté, les blocs try-catch entraînent des frais généraux importants si vous tombez dans le bloc catch. Par conséquent, vous ne voulez généralement pas vous fier à cela sauf s'il est impossible de déterminer si l'élément existe déjà.

N'utilisez pas try-catch pour effectuer le travail d'une instruction If. Try-catch est destiné à des événements inattendus et inhabituels.

MODIFIER Dans votre code mis à jour, vous ne parvenez pas à capturer une exception qui serait levée par le message " AddToXXXXXX " méthode.

Vous devriez faire

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

   }
}

alternativement, vous pouvez séparer les options Add et Savechanges en différents blocs try-catch, mais cela n’est nécessaire que si SaveChanges est exécuté même lorsque la commande Add échoue.

Vous pouvez remplacer le premier Try-Catch par un if, je pense que vous voudrez quand même avoir le second.

Modifier: Il est également déconseillé de capturer toutes les exceptions dans un bloc sans se soucier de leur nature.

P.S. Les blocs Try Catch utilisent plus de puissance de traitement (temps) que les instructions If.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top