¿Excepción de clave duplicada de Entity Framework?

Estoy tratando de ver la excepción lanzada cuando inserto un usuario ya existente con el nombre de usuario dado en mi base de datos. Como dice el título, entonces estoy usando EF. La única excepción que se produce cuando trato de insertar el usuario en db es una “UpdateException”: ¿cómo puedo extraer esta excepción para identificar si es una excepción duplicada o algo más?

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

Pon el número correcto en ?????? eso corresponde a una violación de restricción única (no lo sé desde lo alto de mi cabeza).

Como estoy usando EntityFramework con C #, tuve que hacer un pequeño cambio en esto, espero que ayude a alguien …

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

Mi problema surgió porque necesitaba DbUpdateException en lugar de UpdateException, y mi objeto InnerException tenía un objeto InnerException adicional que contenía el número que necesitaba …

Ahora en C # 6.0 deberías ser capaz de hacer algo como esto:

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

Creo que es mejor si evitas que ocurra la excepción. Si es posible con tu código, haría lo siguiente:

Cuando se utiliza el marco de entidad, lo mejor que se puede hacer primero es intentar obtener la entrada que le causará el problema, con SingleOrDefault de LINQ. Ahora puede actualizar la entidad obtenida con la instancia que desea insertar, le proporciona un número de ID con autoincremento si lo usa. Si SingleOrDefault es nulo, puede agregar su entidad de forma segura.

ejemplo de código:

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