2012-09-26 21 views
7

Digamos que mi objeto tiene un campo Nombre, y deseo dividirlo en los campos Nombre y Apellido. O tal vez tiene una cadena de direcciones y estoy agregando campos Lat y Lng que requieren geocodificación. Etc etc.¿Cómo debo escribir una migración de Entity Framework que transforma los datos (preferiblemente usando el DbContext)?

Esperaba tener acceso a mi DbContext en los métodos Arriba() y Abajo(), pero todo lo que he podido encontrar (además de las funciones integradas) es la llamada .Sql(). Esto es suficiente para agregar y eliminar columnas, pero no para transformar los datos existentes en nuevos formatos.

¿Es seguro hacer referencia a mi DbContext dentro de una invocación hacia arriba()? ¿O hay otro patrón recomendado para implementar migraciones que requieren algo más que SQL trivial?

Respuesta

0

No, no puede usar DbContext dentro del método Up porque ya se refiere a un nuevo modelo, pero su base de datos todavía se dirige al modelo anterior.

Editar:

Todas las migraciones de datos debe hacerse a través Sql. Por ejemplo, puede crear tablas temporales, mover datos antiguos a tablas temporales, usar la migración de la estructura de tablas y mover los datos de la tabla temporal al original con el uso de alguna transformación directamente en SQL. La división de valores varchar no debería ser un gran problema.

+2

Mis transformaciones requeridas no se pueden hacer como SQL (dividir varchar fue un ejemplo radicalmente simplificado). Este tipo de operación de migración es muy natural en un ORM tipo pato como ActiveRecord, pero tiene sentido que este sea un área donde el enfoque EF tendría problemas. – Seth

0

En lugar de tratar de dividir el Nombre en dos campos diferentes, vuelva a pensar su migración. A veces puede ser mejor escenificado. Puedo pensar en dos formas de realizar tu transformación.

Migración ruta # 1: Nuevos Campos, luego Eliminar vieja

  1. Crear migración para el nuevo campo de nombre y apellido, y en el método de arriba(), todavía tiene el campo Nombre, dividirlo , inserte en los campos Primero y Último.
  2. Cree otra migración para eliminar el campo Nombre anterior.

Migración ruta # 2: cambiar la finalidad y cambiar el nombre

  1. Crear una migración de añadir el campo Apellidos, y el cambio de nombre Nombre de Nombre, mover los últimos datos de nombres, modifique el campo Primera/Nombre cambiado a solo mantener el primer nombre.

Ambas rutas tienen ventajas y desventajas. Y a pesar de la complejidad de su transformación, debería ser capaz de dividirla en etapas lógicas para lograr el objetivo.

Cuestiones relacionadas