¿Cómo actualizo un archivo dbml de Linq a SQL?

204

¿Cómo actualizo un archivo .dbml de Linq a SQL?

Apuesta inicial
fuente

Respuestas:

258

Hay tres formas de mantener el modelo sincronizado.

  1. Elimine las tablas modificadas del diseñador y arrástrelas nuevamente a la superficie del diseñador desde el Explorador de la base de datos. He descubierto que, para que esto funcione de manera confiable, debe:

    a. Actualice el esquema de la base de datos en el Explorador de la base de datos (haga clic con el botón derecho, actualice)
    b. Guarde el diseñador después de eliminar las tablas
    c. Guarde nuevamente después de arrastrar las tablas hacia atrás.

    Sin embargo, tenga en cuenta que si ha modificado alguna propiedad (por ejemplo, desactivando la propiedad secundaria de una asociación), obviamente perderá esas modificaciones; tendrá que volver a hacerlas.

  2. Use SQLMetal para regenerar el esquema de su base de datos. He visto varias publicaciones de blog que muestran cómo escribir esto .

  3. Realice cambios directamente en el panel Propiedades del DBML. Esto funciona para cambios simples, como permitir nulos en un campo.

El diseñador DBML no está instalado de forma predeterminada en Visual Studio 2015, 2017 o 2019. Tendrá que cerrar VS, iniciar el instalador de VS y modificar su instalación. Las herramientas LINQ to SQL son la característica que debe instalar. Para VS 2017/2019, puede encontrarlo en Componentes individuales> Herramientas de código .

Robert Harvey
fuente
1
Intenté 1a y 1c sin 1b y recibí los errores 'La conversión especificada no es válida' al realizar una selección simple en una vista. Incluyendo 1b lo arregló para mí
tomfumb
66
Se solicitó el apoyo de VS connect.microsoft.com/VisualStudio/feedback/details/260723/... , pero MS no desea corregir.
Michael Freidgeim
Probé el primer método y funcionó. Supongo que funcionará para una pequeña base de datos.
Muhammedh
Me duele que a fines de 2019, necesitaba una respuesta creada antes de saber qué era la programación de computadoras ... ¡Esto es tan detallado y genial!
PSGuy
54

Para actualizar una tabla en su diagrama .dbml con, por ejemplo, columnas agregadas, haga esto:

  1. Actualice su ventana del Explorador de SQL Server.
  2. Arrastre la "nueva" versión de su tabla al diagrama .dbml (informe1 en la imagen a continuación).

report1 es la nueva versión de la tabla

  1. Marque las columnas agregadas en la nueva versión de la tabla, presione Ctrl+ Cpara copiar las columnas agregadas.

copia las columnas agregadas

  1. Haga clic en la versión "antigua" de su tabla y presione Ctrl+ Vpara pegar las columnas agregadas en la versión ya existente de la tabla.

pegue las columnas agregadas a la versión anterior de la tabla

M463
fuente
44
Este parece ser el método más fácil y menos destructivo que no requiere herramientas adicionales y funciona bien en VS2017
Toby
1
¡Esto es mucho menos intrusivo que la respuesta aceptada y continúa funcionando bien a fines de 2018!
Mark
1
Esta es la mejor respuesta para ediciones rápidas (y no tan rápidas del esquema). Me he tomado mucho tiempo para que la vista del modelo se vea bien. Odiaba eliminar y arrastrar archivos de actualización. ¡Para campos agregados esto funciona muy bien!
Hucker
1
Para mí, esto resolvió dos problemas. La primera fue cuando intenté copiar y pegar un campo similar dentro de la tabla y luego cambiarle el nombre. Eso creó un error de compilación "sin especificar" sin parar al validar. El otro problema es que si eliminé la tabla y luego la volví a agregar en su totalidad, resultó en diferencias mucho mayores en git (porque los objetos se reorganizaron dentro del archivo). Con este método, solo veo la inserción del nuevo campo, que es mucho más limpio y fácil de entender más adelante.
Goug
Por cierto, debe hacer clic en "Sí" cuando aparezca "Los objetos que está agregando al diseñador usan una conexión de datos diferente a la del diseñador ..."
Eitanmg
5

También puede consultar el conjunto de plantillas de generación de código PLINQO , basado en CodeSmith, que le permite hacer muchas cosas interesantes para y con Linq-to-SQL:

  • generar un archivo por clase (en lugar de un solo archivo enorme)
  • actualice su modelo según sea necesario
  • muchas más funciones

Visite el sitio PLINQO en http://www.plinqo.com y eche un vistazo a los videos de introducción.

La segunda herramienta que conozco son las herramientas Huagati DBML / EDMX , que permiten la actualización de archivos de mapeo DBML (Linq-to-SQL) y EDMX (Entity Framework) y más (como convenciones de nomenclatura, etc.).

Bagazo

marc_s
fuente
Habiendo arrancado CodeSmith / PLINQO, recomiendo encarecidamente no adoptar este enfoque. De acuerdo, esta respuesta tiene más de 4 años ...
Yuck
@Yuck: en este momento, recomendaría encarecidamente no usar Linq-to-SQL en absoluto; en su lugar, use Entity Framework, ¡una opción mucho mejor!
marc_s 01 de
Sí lo es. Pasar a EF después de verificar que la aplicación funcionaría con un DBML simple en lugar de PLINQO fue el siguiente paso que tomé para desempolvar una aplicación anterior.
Yuck
4

Usamos una plantilla T4 escrita personalizada que consulta dinámicamente el modelo de información_esquema para cada tabla en todos nuestros archivos .DBML, y luego sobrescribe partes del archivo .DBML con información de esquema fresca de la base de datos. Yo altamenterecomiendo implementar una solución como esta: me ha ahorrado muchísimo tiempo y, a diferencia de eliminar y volver a agregar sus tablas a su modelo, puede mantener sus asociaciones. Con esta solución, obtendrá errores en tiempo de compilación cuando cambie su esquema. Sin embargo, debe asegurarse de que está utilizando un sistema de control de versiones, porque la diferenciación es realmente útil. Esta es una gran solución que funciona bien si está desarrollando con un primer enfoque de esquema de base de datos. Por supuesto, no puedo compartir el código de mi compañía, así que usted es el único responsable de escribir esto. Pero si conoce algo de Linq-to-XML y puede ir a la escuela en este proyecto , puede llegar a donde quiere estar.

mattmc3
fuente
2

Recomendaría usar el diseñador visual integrado en VS2008, ya que la actualización de dbml también actualiza el código que se genera para usted. Si modifica el dbml fuera del diseñador visual, el código subyacente no estará sincronizado.

Jason Miesionczek
fuente
44
Sí, pero el diseñador visual en VS2008 no puede detectar y responder a los cambios en su base de datos subyacente :-( A falta de eliminar y volver a agregar, no hay soporte para actualizar su modelo :-(
marc_s
Si bien eso es cierto, la pregunta era muy vaga y no mencionaba específicamente cómo actualizar un modelo cuando cambia la base de datos.
Jason Miesionczek
2

Hay un matiz en actualizar las tablas y luego actualizar el DBML ... Las relaciones de clave externa no siempre se traen de inmediato si se realizan cambios en las tablas existentes. La solución consiste en hacer una compilación del proyecto y luego volver a agregar las tablas nuevamente. Informé esto a MS y se está arreglando para VS2010.

La pantalla DBML no muestra nuevas restricciones de clave externa


Tenga en cuenta que las instrucciones dadas en la respuesta principal no son claras. Para actualizar la tabla.

  1. Abre la superficie de diseño de dbml
  2. Seleccione todas las tablas con Right-> Click-> Select All o CTRLa
  3. CTRLx (Cortar)
  4. CTRLv (Pegar)
  5. Guarde y reconstruya la solución.
ΩmegaMan
fuente
No creo que esté arreglado, porque connect.microsoft.com/VisualStudio/feedback/details/414601/… relacionado no está arreglado
Michael Freidgeim
¿Hace sus cambios antes o después de cortar y pegar?
Kolob Canyon
Han pasado 10 años ... pero creo que es antes ... hacer los cambios y luego pasar al # 2.
ΩmegaMan
1

En el caso de la actualización del procedimiento almacenado, debe eliminarlo del archivo .dbml y volver a insertarlo. Pero si el procedimiento almacenado tiene dos rutas (por ejemplo: si hay algo; muestra algunas columnas; de lo contrario, muestra otras columnas), ¡asegúrate de que las dos rutas tengan los mismos alias de columnas! De lo contrario, solo existirán las primeras columnas de ruta.

Yasser Hosny Abu Elmakarem
fuente
0

Aquí está el método completo paso a paso que me funcionó para actualizar LINQ to SQL dbml y los archivos asociados para incluir una nueva columna que agregué a una de las tablas de la base de datos.

Debe realizar los cambios en su superficie de diseño como lo sugiere otro anterior; Sin embargo, debe hacer algunos pasos adicionales. Estos son los pasos completos:

1. Drag your updated table from Server Explorer onto the design surface

2. Copy the new column from this "new" table to the "old" table (see M463 answer for details on this step)

3. Delete the "new" table that you just dragged over

4. Click and highlight the stored procedure, then delete it

5. Drag the new stored procedure and drop into place.

6. Delete the .designer.vb file in the code-behind of the .dbml 
   (if you do not delete this, your code-behind containing the schema will
    not update even if you rebuild and the new table field will not be included)

7. Clean and Rebuild the solution (this will rebuild the .designer.vb file to include all the new changes!).
Jeff
fuente