example enumerador enum crear clase c# design enums

enumerador - if condition enum c#



¿Cómo evitar las dependencias entre los valores de Enum en el código y los valores correspondientes en una base de datos? (6)

Tengo una cantidad de permisos de usuario que se prueban a través de mi aplicación ASP.NET. Estos valores de permiso se referencian en un Enum para que pueda probar cómodamente los permisos de esta manera:

  • btnCreate.Enabled = PermissionManager.TestPermission (Permission.AllowCreate);

Sin embargo, también tengo estos permisos almacenados en la base de datos porque necesito contener más información sobre ellos que solo su Id. Pero esto crea una dependencia horrible entre los valores enum y los de la base de datos, un cambio poco pensado para cualquiera y tengo problemas en toda mi aplicación. ¿Hay una mejor manera de solucionar este problema? ¿Alguien a lidiado con esto antes?


Agrego una propiedad extendida en cualquier tabla a la que necesitaré acceder en el código como una enumeración. Luego uso el software de generación de código (codesmith, T4, lo que sea) para generar todas mis enumeraciones buscando cualquier tabla con esta propiedad. Cualquier tabla que se use para esto se rige por algunas reglas básicas (debe tener una columna Nombre, etc.) para que el generador de códigos sepa qué columna usar como el nombre de los elementos de la enumeración.

Una vez que se agregan los valores a esas tablas, nos ocupamos de prácticamente nunca cambiarlos para evitar romper la compilación.


El uso de valores enum es aceptable, siempre y cuando nunca cambie los valores ya asignados. Si estuviera utilizando la autorización estándar basada en roles en .NET, aún estaría confiando en la existencia de ciertas cadenas de texto en la tabla de roles correspondiente en la base de datos.


Hace un tiempo, construí una pequeña herramienta para hacer esto para mi empresa que usaría atributos en los campos enum para permitir la "sincronización" con la tabla en la base de datos.

La herramienta podría escanear un ensamblaje y generar los comandos SQL INSERT / UPDATE apropiados que sincronizarían la base de datos con la definición enumerada en el código.


No sé cuál es la mejor solución, me gustaría escuchar eso. Nuestra solución es escribir explícitamente la enumeración como

public enum MyEnum : int { None =0, Value = 1, AnotherValue =2 }

Y guarde el valor entero en la base de datos. Cuando, por ejemplo, se elimina el Valor 1, aún podrá usar la enumeración y AnotherValue todavía tiene el valor 2 en la base de datos.


O tal vez almacenar los valores enum como cadena en el DB. Encadenar();


Usamos una pequeña aplicación que genera el código enum (ejemplo: NorthwindEnums.cs) de la base de datos. Nos aseguramos de ejecutarlo y actualizar las bibliotecas afectadas siempre que la base de datos cambie.

También tratamos de mantener nuestras enumeraciones comenzando en 0 y secuenciales para evitar problemas con referencias de servicios web en C #.