5

Tengo una tabla Usuarios, que tiene una restricción única en el nombre de usuario (por razones obvias).SQL Inserciones de clave únicas

Estoy utilizando un DAL EF 4.0 para completar la base de datos y en el proceso de codificación del método CreateUser().

¿Es ...

  1. mejor para coger el SqlException arrojado si intento insertar un nombre de usuario que ya existe.
  2. ¿Comprueba explícitamente el nombre de usuario antes de intentar insertarlo en la base de datos?

Si pudieras dar razones de por qué, ¡sería genial!

Respuesta

3

Verificaría si el registro existe primero. Las limitaciones de clave únicas son útiles para protegerse contra las posibles formas en que su aplicación está permitiendo que los datos "malos" pasen, en primer lugar, pero no la parada principal para eso. En general, es una mala idea usar excepciones como mecanismo de flujo de control (validación en este caso) cuando es posible evitarlo.

EDITAR: Para evitar confusiones, no estoy diciendo que no tenga el índice único en absoluto. Debería estar allí, pero no debería ser el principal medio para verificar la singularidad.

+0

Gracias vcsjones. ¿Tiene algún vínculo sobre por qué es una mala idea usar excepciones como mecanismo de flujo de control? – Darbio

+0

Claro, lo referiré a otra discusión SO: http://stackoverflow.com/questions/1336094/using-try-catch-for-flow-control-net Me gusta especialmente esta frase "Las excepciones son para casos excepcionales, no para el flujo normal "En muchos casos, atrapar una excepción nunca es tan claro como cuál es la intención. ¿Qué pasa si la excepción se produce por una razón diferente? ¿Comprobarás la excepción y el mensaje todo el tiempo? ¿Qué pasa si Microsoft cambia el mensaje de excepción en una versión posterior de SQL? – vcsjones

+0

Una buena discusión más sobre ella para una buena medida: http://stackoverflow.com/questions/729379/why-not-use-exceptions-as-regular-flow-of-control – vcsjones

2

Diría que es mejor manejar la excepción. La base de datos está diseñada para manejar la singularidad del nombre de usuario, así que imagino que puede hacerlo de manera más eficiente que usted. También agrega portabilidad y cohesión a su sistema. Si agrega usuarios en más de un lugar, tendrá que duplicar la verificación de nombre de usuario o crear un método y, básicamente, terminará reescribiendo lo que el motor de la base de datos ya ha escrito.

+0

Buen punto re: funcionalidad de reescritura, sin embargo, esto es mitigado por el DAL, lo que significa que todas las acciones del usuario pasan por esto. – Darbio

+1

Una arquitectura bien diseñada no requeriría duplicados. Simplemente ponga la lógica en una clase propia, y use la clase cuando lo necesite. Es eso o captura la excepción cada vez. Lo ideal es que solo haya un único CreateUser dentro de la aplicación. – vcsjones

+0

Correcto: un CreateUser en el DAL que es utilizado por los servicios web que lo necesitan. – Darbio

0

En segundo lugar lo que dijo samuel. La forma más eficiente es dejarlo en la base de datos. Todas las otras opciones consumen más tiempo y recursos ...

1

Además de lo que Samuel dijo, necesitarás asegurarte de que nadie ingrese un registro que pueda entrar en conflicto con el tuyo entre tu cheque y agregar el registro a la base de datos. . Puede lograr esto con un bloqueo, pero luego debe detectar las excepciones causadas por el bloqueo.

En cuanto a la duplicación de cosas en las reglas de negocio y la base de datos, estoy a favor de que la base de datos tenga tanta verificación de consistencia en el lugar como se requiere, incluso si esto duplica algunas cosas en la capa empresarial. Cuanto más bloqueada esté su base de datos contra datos no válidos, mejor. Le protege contra el acceso a su base de datos a través de otras herramientas que no sean su aplicación, como un tipo de soporte que realiza cambios en la base de datos utilizando SSMS para corregir un problema de datos informado por un usuario.

+0

¡Muy buen punto! – Samuel

Cuestiones relacionadas