entity framework - first - ¿Cómo se actualiza un archivo edmx con cambios en la base de datos?
entity framework database first español (5)
Tengo un archivo edmx y cambié una tabla en mi base de datos. Sé que hay un asistente de "Actualizar el modelo desde la base de datos", sin embargo, en muchos casos, esto es inútil.
Por ejemplo, si cambio un campo de no nulo a nulable o si elimino campos, el modelo de actualización no refleja los cambios. Tuve que eliminar la entidad y volver a agregarla para que los cambios aparezcan en mi modelo.
Por la siguiente pregunta: ¿Cómo propagar los cambios de la base de datos a mi archivo .edmx?
Una de las respuestas parece decir lo mismo, que debe eliminar la entidad y volver a agregarla.
¿Es esta la respuesta definitiva o hay una mejor manera de hacer esto?
Actualizando un EDMX de forma segura :
Como ha encontrado, la actualización de la base de datos no siempre cambia las propiedades existentes correctamente.
Desde nuestro uso diario de la actualización de EDMX (cientos de actualizaciones durante 24 meses), recomendaría la siguiente secuencia para actualizar un EDMX.
Eliminar el modelo existente y luego actualizar:
- Abra el diseñador de EDMX
- Ctrl-A para seleccionar todo
- Eliminar clave para eliminar todos los modelos en el diseñador
- IMPORTANTE: ¡No guarde el EDMX en este punto si está bajo control de fuente! *
- Ahora haga clic con el botón derecho y seleccione "Actualizar modelo desde la base de datos" para volver a crear todo el modelo.
- Reconstruir proyecto para propagar cambios
Obviamente, esto perderá todos los ajustes manuales que haya realizado en el modelo, pero se deben evitar los ajustes manuales si es posible. Esto hace que todo el proceso sea reproducible en cualquier momento (lo cual es algo bueno).
Notas importantes:
- Si tiene activada la función de guardado automático en Visual Studio, debe seleccionar la actualización (paso 5 anterior) rápidamente para evitar que se guarde automáticamente guardando todo.
- Si está bajo control de fuente y guarda el EDMX después de vaciarlo, su control de origen marcará todos los archivos generados como "eliminados" y actualizar el EDMX nuevamente puede resultar en archivos desconectados que no están en control de fuente. .
- Este proceso no actualizará ningún procedimiento almacenado. Además, descubrí que una actualización de un EDMX tampoco actualizará los procedimientos almacenados donde solo ha cambiado el tipo de devolución (aún vigente a partir de EF 6.1.1).
Recomendación adicional:
Mantenga su EDMX en una biblioteca separada. Esto también se convierte en un gran lugar para agregar archivos TT adicionales y clases parciales (por ejemplo, para ampliar la función de los modelos EDMX). También coloco cualquier método de extensión para el contexto de la base de datos en esta biblioteca. Los archivos de migration
se generan en la biblioteca, manteniéndolo todo muy bien contenido.
Actualización abril de 2015
La última versión 4 de Visual Studio 2013 parece haber resuelto muchos de los problemas TFS. Ahora vemos los archivos generados de comprobación de Visual Studio y luego los invierte si no se modifican. Los pasos anteriores todavía parecen ser el enfoque más seguro.
Actualización de septiembre de 2015
Con la última versión 5 de VS2013, todavía tenemos problemas si se produce una operación de guardado durante la actualización de EDMX. Todavía puede terminar en un estado en el que las eliminaciones pendientes provoquen que los archivos tt
se eliminen del control de origen durante la actualización. ¡El secreto es actualizar rápidamente entre los pasos 4 y 5! :)
- En primer lugar, haga doble clic en el archivo .edmx
- En segundo lugar, haga clic derecho en el espacio vacío y seleccione "Actualizar el modelo de la base de datos"
- En tercer lugar, seleccione la pestaña Actualizar en la barra de menú.
- Por último, seleccione la tabla que desea actualizar y seleccione Finalizar ...
Considere que he agregado una nueva columna (c1) a mi tabla existente. Luego, para actualizar lo mismo en mi Modelo de Entidad existente, haría lo siguiente.
Abriré el archivo .edmx en el bloc de notas ++.
Agregaré la propiedad c1 al archivo .edmx donde sea necesario. Por ejemplo, agregaría el nodo c1 debajo de cada nodo c0.
<EntityType Name="table">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
<Property Name="c0" Type="nvarchar(max)" />
<Property Name="c1" Type="nvarchar(max)" />
</EntityType>
Recargar el proyecto en Visual Studio.
Y finalmente agregue el atributo c1 al modelo.
Si entiendo su pregunta y su ejemplo, una vez que hace el paso Actualizar modelo de base de datos y está sentado allí en el diagrama de Model.edmx, puede resaltar la propiedad en la clase que desea cambiar y mostrar las propiedades en ella y cambie la propiedad Nullable por Nullable: True. Esa es al menos una forma de hacer esto.
Creo que la idea aquí es que el modelo conceptual (que no se cambia de no nulo a nulable) en realidad puede diferir de la tabla de base de datos subyacente y por lo tanto no cambia esa parte y esa diferencia podría ser exactamente lo que usted pretende. Las dos formas en que manejo esto son eliminar o agregar como mencionaste o, más típicamente, configuré las propiedades manualmente como mencioné.
Un primer paso importante es comprender exactamente qué sucede cuando utiliza el asistente de modelo de actualización.
Desde la biblioteca de MSDN :
El Diseñador de modelos de datos de entidad de ADO.NET (Entity Designer) utiliza el Asistente de modelo de actualización para actualizar un archivo .edmx a partir de los cambios realizados en la base de datos. El Asistente de modelo de actualización sobrescribe el modelo de almacenamiento como parte de este proceso. El Asistente de modelo de actualización también realiza algunos cambios en el modelo conceptual y las asignaciones, pero solo realiza estos cambios cuando los objetos se agregan a la base de datos. Por ejemplo, los nuevos tipos de entidad se agregan al modelo conceptual cuando las tablas se agregan a la base de datos, y las nuevas propiedades se agregan a los tipos de entidad cuando las columnas se agregan a una tabla. Para obtener más información acerca de los cambios realizados en el archivo .edmx, consulte Cambios realizados en un archivo .edmx por el Asistente de modelo de actualización .
Cuando actualizó la base de datos utilizando el asistente de modelo de actualización, actualizó el modelo de almacenamiento en el archivo .edmx y no el modelo conceptual. Cuando se realizan cambios en la definición de objetos existentes, solo se actualiza el modelo de almacenamiento; el modelo conceptual no está actualizado. Para obtener una descripción completa de los cambios realizados por el asistente del modelo de actualización, consulte el enlace "Cambios realizados en un archivo .edmx por el Asistente de actualización del modelo" más arriba.
Aquí hay algunas opciones sobre cómo actualizar objetos que no son actualizados por el asistente del modelo de actualización (de acuerdo con su escenario donde se modificó la definición de la columna):
- Utilice el asistente de modelo de actualización (para actualizar el modelo de almacenamiento), abra el archivo .edmx utilizando el diseñador (predeterminado), busque la propiedad escalar deseada y edite las propiedades deseadas en la ventana Propiedades.
- Utilice el asistente de modelo de actualización (para actualizar el modelo de almacenamiento), abra el archivo .edmx con el editor XML, encuentre la propiedad deseada en la sección CSDL (modelo conceptual) y cambie los atributos deseados. Esto es básicamente lo mismo que la opción 1, pero está editando el XML directamente (un hallazgo y reemplazo podría ser útil aquí).
- Desde el Navegador de modelos, elimine la entidad deseada de la sección Tipos de entidades del modelo conceptual y la tabla deseada de la sección Tablas / Vistas del modelo de almacenamiento. A continuación, utilice el asistente de modelo de actualización para volver a agregarlo.
La mejor opción dependería del escenario dado. Por ejemplo, si acabas de alterar la definición de una columna, entonces la opción 1 es la mejor opción. Si modificó la definición de varias columnas en una sola tabla, la opción 3 podría ser su mejor opción. Si modificó una columna que se utiliza en varias tablas (como una clave principal / externa), la mejor opción es editar el XML .edmx directamente.