2

Ist es akzeptabel, dies zu tun? Versuchen Sie zuerst, die Entität hinzuzufügen. Wenn das Hinzufügen fehlschlägt, spielt es keine Rolle, weil das bedeutet, dass die Entität bereits existiert?Ist es in Ordnung, sich auf eine try-catch in einer CreateOrUpdate-Methode für das Entity Framework zu verlassen?

Oder gibt es eine elegantere/einfachere Lösung?

EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel(); 

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

} 

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

OK I verkürzt es ...

EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel(); 

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

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

Antwort

7

Es ist sicherlich nicht OK, dies zu tun. Eine catch-Anweisung ohne Typ in C# bedeutet "irgendeine Standard- oder Nicht-Standard-Ausnahme abfangen". Sie beabsichtigen jedoch, ein doppeltes Hinzufügen zu verhindern. Adds können aus verschiedenen Gründen fehlschlagen, die nicht auf einen vorhandenen Eintrag hinweisen. Diese Methode könnte beispielsweise eine Nullreferenz ausgeben und Sie würden davon ausgehen, dass sie hinzugefügt wurde.

Wenn Sie nach einem Duplikat suchen möchten, müssen Sie müssen fangen nur die Ausnahme, die für eine doppelte hinzufügen geworfen wird.

0

Sie könnten den ersten Try-Catch mit einer If-Anweisung ersetzen, ich denke, dass Sie immer noch die zweite wollen.

Edit: Es ist auch nicht empfehlenswert, alle Ausnahmen in einem Block zu fangen, ohne Rücksicht darauf, was sie sind.

P.S. Try Catch-Blöcke verwenden mehr Verarbeitungsleistung (Zeit) als If-Anweisungen.

1

Sie möchten mit einer IfExists-Stilmethode beginnen und dann das Speichern der Änderungen überspringen, wenn Sie keine Änderungen vorgenommen haben. Wie von Lucas angemerkt, haben try-catch-Blöcke einen hohen Aufwand, wenn Sie in den catch-Block fallen. Daher sollten Sie sich im Allgemeinen nicht darauf verlassen, es sei denn, es gibt keine Möglichkeit festzustellen, ob das Element bereits existiert.

Verwenden Sie keine Try-Catch, um eine If-Anweisung auszuführen. Try-Catch ist für ungewöhnliche unvorhergesehene Ereignisse.

EDIT In Ihrem aktualisierten Code, scheitern Sie eine Ausnahme zu fangen, die von der „AddToXXXXXX“ Methode ausgelöst werden würde.

Sie sollten alternativ

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

    } 
} 

tun, können Sie verschiedene Try-Catch-Blöcke trennen könnte das Hinzufügen und Savechanges in, aber das ist nur notwendig, wenn Savechanges selbst ausgeführt wird, wenn Hinzufügen fehlschlägt.