2012-08-13 12 views
7

En this question, descubrí que los cambios de enumeración no son manejados por las migraciones de Entity Framework. De hecho, los cambios de enumeración ni siquiera dan como resultado un error de cambio de modelo, por lo que puede cambiar las enumeraciones a voluntad sin ningún control.Gestión de cambios de enumeración en Entity Framework 5

Los cambios enum que dan como resultado diferentes valores int, como cambios o eliminaciones de orden, pueden hacer que los datos de la base de datos sean inválidos, ya que el significado del entero almacenado ahora es incorrecto.

Para que las migraciones funcionen, debe ejecutar SQL personalizado que cambia los valores enum modificados.

El problema es que el desarrollador debe recordar hacer esto, y si hubo un descuido, se pueden producir daños en los datos.

¿Cómo alguien puede poner controles en contra de esto? ¿Es posible, en el caso de que una enumeración cambie, arrojar un error de cambio de modelo o algo así?

+1

La misma pregunta se aplica a los cambios de nombre: si alguien se olvida de tratar, se eliminará especialmente la columna anterior y se creará una nueva. Las migraciones automáticas no son adecuadas para el uso de producción si el tiempo de inactividad es una preocupación. – usr

+0

Como no se requiere un cambio de modelo para nuevas enumeraciones, no se lanzará ningún error de cambio de modelo. EF no tiene forma de saber que el valor enum '1' en la base de datos es diferente de 'Auto' que tenía ese valor, pero desde que se renombró a 'camión', las enumeraciones generalmente se consideran constantes y no deberían modificarse. – simbolo

+0

Bueno, existe ContextKey, un nombre de tipo completamente calificado, y un Modelo, que es una especie de blob binario en la tabla __MigrationHistory. Ese blob debería contener la definición de Enum y detectar este tipo de cambios. Aparentemente no. Esto parece un mal diseño de EF. – Eiver

Respuesta

2

Un problema similar con enumeraciones existe en .Net cuando se mude a un proyecto diferente para ser utilizado como una biblioteca:

http://bytes.com/topic/c-sharp/answers/271483-q-why-casting-enum#post1086722

probarlo - enumeraciones en general son sorprendentemente frágil. La respuesta es asignar siempre un valor explícito a tus enumeraciones, para evitar ambos problemas. Esto le permite aprovechar su valor central (nombres claros en lugar de números mágicos y un poco más para escribir seguridad en los argumentos del método), pero le impide romper silenciosamente todo.

Puede hacer cumplir esta política con revisiones de código o enlaces posteriores a la confirmación a través de una expresión regular.

Cuestiones relacionadas