2

Est-ce acceptable de le faire? 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à?Est-il correct de s'appuyer sur un try-catch dans une méthode CreateOrUpdate pour Entity Framework?

Ou y at-il une solution plus élégante/facile?

EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel(); 

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

} 

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

OK Je raccourci pour ...

EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel(); 

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

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

Répondre

7

Il est certainement pas OK pour le faire. Une instruction catch sans type en C# signifie "attraper une exception standard ou non standard". Mais vous avez l'intention d'éviter 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 renvoyer une référence nulle et supposer qu'elle a été ajoutée.

Si vous voulez vérifier un duplicata ajouter, vous doit attraper que l'exception qui est levée pour un complément en double.

0

Vous pouvez remplacer le premier Try-Catch par une instruction If, mais je pense que vous voudrez toujours le second.

Editer: Il est également déconseillé d'attraper toutes les exceptions dans un bloc sans tenir compte de ce qu'elles sont.

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

1

Vous souhaitez commencer avec une méthode de style IfExists, puis ignorer l'enregistrement de vos modifications, sauf si vous avez réellement des modifications. Comme l'a noté Lucas, les blocs try-catch ont une grande surcharge si vous tombez dans le bloc catch, donc généralement vous ne voulez pas compter dessus à moins qu'il n'y ait aucune façon possible de déterminer si l'élément existe déjà. N'utilisez pas un try-catch pour faire un travail d'instruction If. Try-catch est pour des événements inattendus inhabituels.

EDIT Dans votre code mis à jour, vous ne parviennent pas à intercepter une exception qui serait lancée par la méthode « AddToXXXXXX ».

Vous devriez faire

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

    } 
} 

Sinon, vous pouvez séparer Ajouter et SaveChanges dans différents blocs-prises d'essai, mais cela est nécessaire que si SaveChanges est exécuté même si Ajouter échoue.

Questions connexes