En el primer escenario en el que ha cambiado el primer código del modelo, antes de ingresar y modificar la base de datos de forma manual, la respuesta es abrir la consola y el tipo (Nuget) Gestor de paquetes:
update-database -verbose
Excepto - porque en este Si está eliminando una columna, esto informará que está a punto de eliminar algo, y no eliminará nada sin que explícitamente indique que está bien.Entonces escribe:
update-database -f -verbose
Ahora esto eliminará la columna que tenía en su Modelo. -verbose
dice que le muestre el SQL que ejecuta. Si tienes miedo de que acaba de dejar borrar las cosas y en vez inspeccionar el SQL antes de que funcione, utilice:
actualización de la base de datos-f -script
Ese lugar será volcar el SQL a una secuencia de comandos se puede ver más, y ejecutar manualmente usted mismo.
En el caso en que siguió y borró la columna en la base de datos manualmente, ahora tiene un escenario más complejo en sus manos; la tabla EdmMetadata descrita en la otra respuesta aquí contiene un hash de toda la base de datos que ahora no coincide con la base de datos en sí. Puede ejecutar SQL manual para devolver el DB a la forma en que Entity Framework espera (tal como era antes de que lo modificara manualmente, lo que lo vuelve a alinear con el hash) inspeccionando lo que tenía antes y cómo se ve actualmente su BD.
Si eso no es posible, ahora se encuentra en la parte más fea de Entity Framework Code First. Debe eliminar la tabla hash e invertir la ingeniería de la base de datos en archivos de código.
El nombre de la tabla hash depende de la versión de EF. En EF4 anterior, como usted preguntaba, se llama EdmMetadata. En EF5 más nuevo, se llama __MigrationHistory (en System Tables en su base de datos si está buscando en SQL Server Management Studio). Tendrás que borrarlo.
La buena noticia sobre el segundo paso, la ingeniería inversa de la base de datos en el código, es que Microsoft ha lanzado una herramienta en beta que hará esto por usted.
Walk-through of reverse-engineering a db, and EF Power Tools
Puede omitir muchos de los primeros pasos que hay ya que son sólo la creación de una base de datos y añadiendo un poco de sentido a la misma para que puedan demostrar lo que tiene que hacer: aplicar ingeniería inversa a una base de datos.
Actualización:
También puede ser factible utilizar una migración manual para evitar este escenario. Hacer una copia de seguridad de la base de datos, a continuación, ejecute:
add-migration WhateverYouWantToCallThis
Las modificaciones a las migraciones db EF que se deben ejecutar aparecerán en los comandos de C# generadas. Ahora le toca a usted jugar con ellos para resolver los problemas con lo que está intentando hacer (por ejemplo, intentar eliminar columnas que ya han sido eliminadas), y poner en su lugar las cosas que necesitará en el futuro (por ejemplo, volver a agregar una tabla que todavía tiene en su modelo pero que borró manualmente en su db).
Una vez que haya agregado esto y ejecute update-database -f
, EF Code First solo aceptará con la fe que ha actualizado la base de datos de la manera que necesita y actualizará su hash en función del resultado final. Si realizó los cambios correctos, ahora puede continuar con Migraciones de forma normal. Si esto sigue causando errores, generalmente puede copiar los comandos de la migración manual en algún lugar y eliminarlos, restaurar el archivo db de su copia de seguridad, agregar una migración manual nuevamente e intentar nuevamente. En el peor de los casos, recurre al paso de ingeniería inversa anterior.
O paso 7 en este tutorial ;-) http://weblogs.asp.net/scottgu/archive/2011/01/11/vs-2010-sp1-and-sql -ce.aspx La solución es bastante simple: después de haber actualizado la base de datos (eliminó/agregó los campos necesarios manualmente), debe truncar la tabla generada automáticamente "EdmMetadata" ya que almacena un ModelHash en ella. Esto es. – Mike