Va bene fare affidamento su un try-catch in un metodo CreateOrUpdate per Entity Framework?
-
22-07-2019 - |
Domanda
È accettabile farlo? Prima prova ad aggiungere l'entità. Se l'aggiunta fallisce, non importa perché ciò significa che l'entità esiste già?
O esiste una soluzione più elegante / facile?
EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();
try
{
dal.AddToXXXXXX(xxxxxxx);
}
catch
{
}
try
{
dal.SaveChanges();
return true;
}
catch
{
return false;
}
OK l'ho abbreviato in ...
EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();
if(xxxxxxx.ID == 0)
{
dal.AddToXXXXXX(xxxxxxx);
}
try
{
dal.SaveChanges();
return true;
}
catch
{
return false;
}
Soluzione
È certamente non OK farlo. Un'istruzione catch senza tipo in C # significa "rilevare qualsiasi eccezione standard o non standard". Ma il tuo intento è prevenire un duplicato Aggiungi. Le aggiunte possono fallire per una serie di motivi che non sono indicativi di una voce esistente. Ad esempio, quel metodo potrebbe generare un riferimento null e supponeresti che sia stato aggiunto.
Se desideri verificare un'aggiunta duplicata, devi catturare solo l'eccezione generata per un'aggiunta duplicata.
Altri suggerimenti
Dovresti iniziare con un metodo di stile IfExists e quindi saltare il salvataggio delle modifiche a meno che tu non abbia effettivamente delle modifiche.
Come notato da Lucas, i blocchi try-catch hanno un grande sovraccarico se cadi nel blocco catch, quindi generalmente non vuoi fare affidamento su di esso a meno che non ci sia modo di determinare se l'oggetto esiste già.
Non usare un try-catch per fare il lavoro di un'istruzione If. Try-catch è per insoliti eventi imprevisti.
Modifica Nel tuo codice aggiornato, non riesci a rilevare un'eccezione che verrebbe generata da " AddToXXXXXX " metodo.
Dovresti farlo
If(!XXXXXX.Contains(newItemValue))
{
try
{
add...
savechanges...
}
catch
{
}
}
in alternativa, potresti separare Add e Savechanges in diversi blocchi try-catch, ma ciò è necessario solo se SaveChanges viene eseguito anche quando Aggiungi fallisce.
Potresti sostituire il primo Try-Catch con un'istruzione If, ??penso che comunque vorrai comunque il secondo.
Modifica: Inoltre non è consigliabile catturare tutte le eccezioni in un blocco, indipendentemente da ciò che sono.
P.S. Prova I blocchi di cattura utilizzano più potenza di elaborazione (tempo) rispetto alle istruzioni If.