Pregunta

Tengo un objeto de datos (digamos que se llama 'Entrada') que tiene un conjunto de estados potenciales que se parecen a esto:

1 - Created
2 - File added
3 - Approved
4 - Invalid

Esto se representa en la base de datos con una tabla de 'Estado' con una clave principal autonumérica, luego un campo de 'Estado de ID' en la tabla principal, con las relaciones apropiadas configuradas.

En mi capa de datos (personalizada), tengo el objeto 'Entrada' y, actualmente, también declaro un Enum con los estados especificados anteriormente. Finalmente declaro una instancia privada de este Enum junto con la propiedad pública apropiada.

En mi método 'Commit ()', convierto la instancia de Enum a un entero y la paso a un procedimiento almacenado de actualización.

En mi método estático 'GetEntry ()' obviamente tendré un entero devuelto desde la base de datos. Luego uso el método 'Enum.Parse ()' para extraer un objeto que es una instancia de mi Enum que corresponde al entero devuelto de estado. Convierto esto al tipo de mi Enum y lo asigno a la variable privada local.

Mi pregunta es bastante simple: es este enfoque apropiado y, si no es así, cuál es la mejor alternativa, aparte de almacenar el valor entero bruto (que no soy necesariamente contrario),

Mi razón para preguntar es que todo esto me parece increíblemente desordenado, con todos los lanzamientos y manteniendo dos listas del mismo conjunto de valores. Acepto que el beneficio radica en una mejor experiencia para el consumidor del objeto de datos, pero aún así ...

¡Gracias!

¿Fue útil?

Solución

Tenemos algo familiar en uno de nuestros proyectos. Tenemos una tabla que contiene tipos de artículos. Estos tipos tienen una identificación, en el código tenemos una enumeración con las mismas identificaciones. El problema es que en la base de datos no usamos autonumber (identidad), por lo que tenemos el control total de la identificación. Y cuando guardamos nuestro objeto, simplemente tomamos la identificación de la enumeración para guardar el objeto. También pensé que este enfoque era complicado, pero no está tan mal después de todo.

Otros consejos

Ese método me parece bien.

En el pasado he hecho lo mismo, pero también tenía una tabla que contenía una fila para cada miembro de la enumeración. Esa tabla era la clave externa para cualquier tabla que usara el valor de enumeración, solo para que alguien lea la base de datos. Podía entender qué era cada estado sin tener que ver la enumeración real.

por ejemplo, si tuviera una enumeración como

enum status
{
    Active,
    Deleted,
    Inactive
}

Tendría una tabla llamada status que tendría los siguientes registros

ID & nbsp; & nbsp; Nombre
0 & nbsp; & nbsp; & nbsp; Activo
1 & nbsp; & nbsp; & nbsp; Eliminado
2 & nbsp; & nbsp; & nbsp; Inactivo

Esa tabla sería la clave externa de cualquier tabla que usara esa enumeración.

Sí, esto está bien!

POR FAVOR siempre establezca explícitamente los valores como este. De esa manera, si alguien alguna vez va a agregar algo, se dará cuenta de que los valores son importantes y que no se debe alterar.

enum status
{
    Active = 1,
    Deleted = 2,
    Inactive = 3
}

Si está pasando el valor a través de WCF, recomiendo agregar

  NULL = 0

De lo contrario, si intentas serializar un 0 proveniente de la base de datos obtendrás un error horrible y te llevará una depuración más larga.

la tabla de búsqueda de base de datos es necesaria; la enumeración programática es conveniente para evitar tener "números mágicos" en el código

Si su código no necesita manipular el estado, sin embargo, la enumeración es innecesaria

Hago este enfoque con Enums todo el tiempo. Si es un elemento simple como el estado que no se espera que cambie nunca, prefiero el Enum. El análisis y la fundición es una operación de muy bajo impacto.

He estado haciendo esto con éxito con Linq to Sql desde hace algún tiempo sin problemas. Linq realmente convertirá de Enum a int y volverá automáticamente.

El código es más que solo velocidad, pero legibilidad. Las enumeraciones hacen que el código sea legible.

Para responder a su pregunta directamente, este es un apporach muy válido.

Si su código requiere una configuración conocida de " Estado " valores (que ha definido en su enumeración), entonces es probablemente también un requisito que los " Estado " Los valores existen en la base de datos. Dado que deben existir, también debe tener control sobre el Status_ID asignado a cada uno de esos valores.

Descarte la identidad y simplemente establezca explícitamente los ID de valor de búsqueda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top