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;
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top