Estoy tratando de detectar 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?¿Excepción de clave duplicada de Entity Framework?
Respuesta
catch (UpdateException ex)
{
SqlException innerException = ex.InnerException as SqlException;
if (innerException != null && innerException.Number == ??????)
{
// handle exception here..
}
else
{
throw;
}
}
poner el número correcto en ??????
que corresponde a la única violación de restricción (no sé que desde lo alto de la cabeza).
Perfecto :) - Sin embargo ... Intenté atrapar el Código de Error y dice que el código de error para una entrada duplicada es -2146232060, lo cual me parece un poco extraño. – ebb
Mi mal ... usé errorCódigo en su lugar. Gracias :) – ebb
Para referencia futura: [2601] (http://msdn.microsoft.com/en-us/library/aa258747 (v = sql.80) .aspx) es una violación de restricción única (para SQL Server). – kamranicus
Ahora en C# 6.0, debe ser capaz de hacer algo como esto:
catch (UpdateException ex) when ((ex.InnerException as SqlException)?.Number == ??????)
{
// Handle exception here
}
porque estoy usando ADO.NET Entity Framework con C#, tuve que hacer un pequeño cambio en esto - creo que sirve a nadie .. .
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 se produjo porque necesitaba DbUpdateException en lugar de UpdateException, y mi objetivo InnerException tenía un objeto InnerException adicional que contenía el número que necesitaba ...
Gracias, esto fue útil. Voy a usar esto, pero con un cheque nulo adicional en la línea 7; tal como está escrito, el bloque catch lanzará una NullReferenceException si ex.InnerException (es decir, la primera InnerException anidada) es nula. –
Creo que es mejor si evita que ocurra la excepción. Si es posible con su código, haría lo siguiente:
Al usar el marco de entidad, lo mejor que puede hacer es primero intentar y 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);
}
- 1. MySQL Insertar de clave duplicada
- 2. Clave principal/externa en Entity Framework
- 3. Entity Framework Association con campos no clave
- 4. Entity Framework: campo de clave compuesta no puede ser anulable?
- 5. Código de Entity Framework primero: actualización SetInitializer arroja la excepción
- 6. Autonumérico con Entity Framework
- 7. Código Entity Framework Primera clave de solo lectura
- 8. Claves externas de Entity Framework para campos clave no primarios
- 9. ¿Ha olvidado la clave duplicada?
- 10. Vistas y Entity Framework
- 11. Código Entity Framework First ReadOnly Entity
- 12. inserción de MySQL en clave duplicada; ¿borrar?
- 13. Actualización de clave duplicada - Varias columnas
- 14. MySQL en actualización de clave duplicada
- 15. condicional en la actualización de clave duplicada
- 16. SQLite con Entity Framework
- 17. ignorar inserción de filas que infringen índice de clave duplicada
- 18. Validación de Entity Framework
- 19. proyecciones de Entity Framework
- 20. Entity Framework 4 - Herencia
- 21. Entity Framework 4.3.1 -> 5.0 Excepción: "EntityType no tiene una clave definida. Defina la clave para este EntityType".
- 22. Entity Framework lista
- 23. Entity Framework relación muchos a muchos sin clave primaria
- 24. Entity Framework 5 Nombramiento clave con el código primero
- 25. Entity Framework - Inserción en varias tablas usando la clave externa
- 26. Entity Framework 4: ¿Cómo encontrar la clave principal?
- 27. .NET Entity Framework Agregar nueva fila con clave primaria incremental
- 28. Entity Framework Code-First: defina la clave para este EntityType
- 29. ¿Cómo utilizar la palabra clave BETWEEN en Entity Framework?
- 30. Entity Framework: ¿Cómo elimino un registro por su clave principal?
como con cualquier excepción, un vistazo a la InnerException para averiguar los detalles del error exactas. – RPM1984