Eccezione chiave duplicata da Entity Framework?

Sto cercando di rilevare l’eccezione generata quando inserisco un utente già esistente con il nome utente specificato nel mio database. Come dice il titolo, sto usando EF. L’unica eccezione che viene lanciata quando provo a inserire l’utente in db è una “UpdateException” – Come posso estrarre questa eccezione per identificare se si tratta di un’eccezione duplicata o qualcos’altro?

Perché sto usando EntityFramework con C #, ho dovuto apportare una piccola modifica a questo – spero che aiuti chiunque …

 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; } } 

Il mio problema si è verificato perché avevo bisogno di DbUpdateException invece di UpdateException e il mio object InnerException aveva un object InnerException aggiuntivo che conteneva il numero di cui avevo bisogno …

Ora in C # 6.0 dovresti essere in grado di fare qualcosa del genere:

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

Penso sia meglio se impedisci che si verifichi l’eccezione. Se è ansible con il tuo codice, farei quanto segue:

Quando si utilizza il framework di quadro, la cosa migliore da fare è innanzitutto provare e ottenere la voce che ti causerà il problema, con SingleOrDefault di LINQ. Ora puoi aggiornare l’entity framework acquisita con l’istanza che desideri inserire, ti consente di ottenere un numero identificativo con incremento automatico se lo usi. Se SingleOrDefault è nullo, puoi tranquillamente aggiungere la tua quadro.

esempio di codice:

  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); }