2010-10-19 22 views
22

Ich versuche, die ausgelöste Ausnahme zu erfassen, wenn ich einen bereits vorhandenen Benutzer mit dem angegebenen Benutzernamen in meine Datenbank einfüge. Wie der Titel sagt, verwende ich EF. Die einzige Ausnahme, die ausgelöst wird, wenn ich versuche, den Benutzer in db einzufügen, ist eine "UpdateException" - Wie kann ich diese Ausnahme extrahieren, um festzustellen, ob es eine doppelte Ausnahme oder etwas anderes ist?Doppelte Schlüsselausnahme von Entity Framework?

+0

wie bei jeder Ausnahme, Blick auf die Innerexception die genauen Fehlerdetails zu erfahren. – RPM1984

Antwort

34
catch (UpdateException ex) 
{ 
    SqlException innerException = ex.InnerException as SqlException; 
    if (innerException != null && innerException.Number == ??????) 
    { 
     // handle exception here.. 
    } 
    else 
    { 
     throw; 
    } 
} 

die richtige Anzahl an ?????? Setzen, die eindeutige Einschränkung Verletzung entspricht (ich weiß nicht, es aus der Spitze von meinem Kopf).

+0

Perfekt :) - Aber .. Ich habe gerade versucht, den ErrorCode abzufangen, und es sagt, dass der Fehlercode für einen doppelten Eintrag -2146232060 ist, der mir ein bisschen seltsam erscheint? – ebb

+0

Mein schlechter .. benutzter errorCode stattdessen. Danke :) – ebb

+9

Für zukünftige Referenz: [2601] (http://msdn.microsoft.com/en-us/library/aa258747 (v = sql.80) .aspx) ist eine eindeutige Einschränkung der Einschränkung (für SQL Server). – kamranicus

11

Jetzt in C# 6.0 sollten Sie, so etwas tun können:

catch (UpdateException ex) when ((ex.InnerException as SqlException)?.Number == ??????) 
{ 
    // Handle exception here 
} 
10

Weil ich EntityFramework mit C# bin mit, hatte ich eine kleine Änderung, dies zu machen - hoffen, dass es jemand hilft ..

.
try 
{ 
    await db.SaveChangesAsync(); 
} 
catch (DbUpdateException ex) 
{ 
    SqlException innerException = ex.InnerException.InnerException as SqlException; 
    if (innerException != null && (innerException.Number == 2627 || innerException.Number == 2601)) 
    { 
     //your handling stuff 
    } 
    else 
    { 
     throw; 
    } 
} 

Mein Problem kam zustande, weil ich brauchte DbUpdateException statt UpdateException, und mein Objekt hatte Innerexception ein zusätzliches Innerexception-Objekt, das die Nummer enthielt ich brauchte ...

+0

Danke, das war hilfreich! Ich werde das verwenden, aber mit einem zusätzlichen Null-Check in Zeile 7; Wie beschrieben, wird der catch-Block eine NullReferenceException auslösen, wenn ex.InnerException (d. h. die erste verschachtelte InnerException) null ist. –

0

Ich denke, es ist besser, wenn Sie verhindern, dass die Ausnahme auftritt. Wenn es mit Ihrem Code möglich ist, würde ich Folgendes tun:

Bei der Verwendung von Entity-Framework ist die beste Sache zu tun, zuerst zu versuchen und den Eintrag, der Ihnen den Ärger mit LINQs SingleOrDefault verursacht. Jetzt können Sie die erhaltene Entity mit der Instanz aktualisieren, die Sie einfügen möchten, und erhalten eine ID-Nummer mit Auto-Inkrement, wenn Sie sie verwenden. Wenn SingleOrDefault null ist, können Sie Ihre Entität sicher hinzufügen.

Beispiel Code:

public override void AddOrUpdate(CustomCaseSearchCriteria entity) 
    { 
     var duplicateEntityCheck = GetSingleByUniqueConstraint(entity.UserCode, entity.FilterName); 
     if (duplicateEntityCheck != null) 
     { 
      duplicateEntityCheck.Overwrite(entity); 
      base.Update(duplicateEntityCheck); 
     } 
     else 
      base.Add(entity); 
    } 

    public virtual CustomCaseSearchCriteria GetSingleByUniqueConstraint(string userCode, string filterName) 
    { 
     return GetAllInternal().SingleOrDefault(sc => sc.UserCode == userCode && sc.FilterName == filterName); 
    }