2010-04-06 21 views
15

He realizado algunos cambios en la estructura de la tabla y especialmente en las relaciones entre tablas en mi base de datos de SQL Server. Ahora quiero actualizar mi modelo de Entidad basado en esta nueva estructura de base de datos.¿Cómo actualizar correctamente un Modelo de entidad después de cambios en la estructura de la base de datos?

Haciendo clic con el botón derecho sobre el archivo edmx encuentro la opción "Actualizar el modelo desde la base de datos". Pero cuando hago esto obtengo una especie de actualización del 50%: las nuevas columnas aparecen en las clases Entity, pero estoy confundido acerca de muchas propiedades de navegación que todavía están allí en el modelo, aunque las relaciones de clave externa correspondientes ya no existen en la base de datos. (Edit: También los miembros en las clases de modelo no se eliminan aunque las columnas en la base de datos se han eliminado.)

¿Estoy haciendo algo mal? ¿O hay otra opción para actualizar el modelo, incluida la eliminación de las propiedades de navegación? ¿O tengo que eliminar esas propiedades de navegación de forma manual en los archivos del modelo?

Estoy utilizando Entity Framework Version 1 (VS 2008 SP1).

¡Gracias por la ayuda con anticipación!

Respuesta

16

Está haciendo lo correcto para actualizar. Sin embargo, después de generar automáticamente un modelo, puede personalizarlo. Cuando actualiza, el diseñador de EF desea probar y preservar cualquier personalización que haya realizado. Tiene que adivinar sobre esto, y no siempre es correcto. Trataré de explicar cómo adivina, ya que esto podría ayudarte.

Su EDMX tiene tres partes:

  • esquema de cliente (CSDL)
  • tienda esquema (LSCD)
  • Mapeo entre cliente y tienda (MSL)

El diseñador "posee "el esquema de la tienda". Se regenerará casi desde cero cada vez que actualice. Aunque es posible personalizar el esquema de la tienda editando manualmente el SSDL, a menudo pierde estos cambios cuando actualiza su modelo.

Usted, por otro lado, "posee" el esquema del cliente. El diseñador generaría el esquema del cliente la primera vez que se ejecuta y generará el esquema del cliente para los objetos de metadatos de la base de datos importados recientemente, como las tablas o columnas recién asignadas. Pero una vez que el esquema del cliente se ha generado para un objeto, por lo general no se regenerará, porque el diseñador está tratando de preservar sus personalizaciones. Si, por lo tanto, cambia su base de datos de tal manera que afecte el esquema del cliente, debe actualizar el esquema del cliente manualmente. Puede hacerlo en el diseñador de GUI, o manualmente, en el XML.

En su caso, lo más fácil sería seleccionar la navegación en el diseñador de la GUI y eliminarla. Esto es presumir que ya no hay una propiedad de ID para la navegación en la base de datos, en cualquier lado de la relación.

+2

¡Gracias por la buena explicación! Eliminaré las propiedades de navegación y los campos de miembros de forma manual. Y en caso de que arruine el modelo, borraré el archivo edmx y volveré a crear el modelo desde cero (ya que no tengo personalizaciones hechas en el modelo). – Slauma

3

Si está trabajando con un modelo de entidad que no se ha personalizado y simplemente necesita obtener cambios de su base de datos SQL en su proyecto VS, me resulta más fácil eliminar el modelo de entidad y regenerarlo desde la misma fuente . De esta forma, las tres partes de su EDMX reflejarán lo que hay en su base de datos. He utilizado la opción "Actualizar el modelo de la base de datos" antes y luego he editado el XML/diseñador y he descubierto que es un trabajo tedioso y lento cuando se trata de grandes bases de datos. No me malinterprete, funciona al 100%, pero es mucho más rápido mantener el modelo actualizado recreándolo.Incluso si TIENE que editar algunas consultas LINQ-to-SQL posteriormente, me parece mejor editar consultas LINQ-a-SQL que editando modelos EDMX. Dicho eso, no he tenido que hacer eso todavía. IMPORTANTE: Asegúrese de recrear su modelo con la misma configuración que antes, por ejemplo, si lo creó sin pluralizar los nombres de los objetos antes, haga lo mismo.

Cuestiones relacionadas