Come posso aggiornare un file dbml da Linq a SQL?


204

Come posso aggiornare un file .dbml di Linq to SQL?

Risposte:


258

Esistono tre modi per sincronizzare il modello.

  1. Eliminare le tabelle modificate dalla finestra di progettazione e trascinarle nuovamente nell'area di progettazione da Esplora database. Ho scoperto che, affinché funzioni in modo affidabile, devi:

    un. Aggiorna lo schema del database in Esplora database (tasto destro del mouse, aggiorna)
    b. Salvare il designer dopo aver eliminato le tabelle
    c. Salva di nuovo dopo aver trascinato indietro le tabelle.

    Nota che se hai modificato qualsiasi proprietà (ad esempio, disattivando la proprietà figlio di un'associazione), questo ovviamente perderà quelle modifiche - dovrai apportarle di nuovo.

  2. Utilizzare SQLMetal per rigenerare lo schema dal database. Ho visto un numero di post sul blog che mostrano come scrivere questo .

  3. Apporta le modifiche direttamente nel riquadro Proprietà del DBML. Funziona per semplici modifiche, come consentire null su un campo.

Il designer DBML non è installato per impostazione predefinita in Visual Studio 2015, 2017 o 2019. Dovrai chiudere VS, avviare il programma di installazione VS e modificare l'installazione. Gli strumenti LINQ to SQL sono la funzione che devi installare. Per VS 2017/2019, puoi trovarlo in Componenti singoli> Strumenti codice .


1
Avevo provato 1a e 1c senza 1b e stavo ottenendo errori "Il cast specificato non è valido" quando eseguivo una selezione semplice su una vista. Incluso 1b risolto il problema per me
tomfumb

6
Il supporto VS è stato richiesto il connect.microsoft.com/VisualStudio/feedback/details/260723/... , ma MS non vogliono correzione.
Michael Freidgeim,

Ho provato il primo metodo e ha funzionato. Suppongo che funzionerà per un piccolo DB.
Muhammedh,

Mi dispiace che alla fine del 2019, avevo bisogno di una risposta creata prima di sapere quale fosse la programmazione del computer ... Questo è così dettagliato e fantastico!
PSGuy,

54

Per aggiornare una tabella nel diagramma .dbml con, ad esempio, colonne aggiunte, procedere come segue:

  1. Aggiorna la finestra di SQL Server Explorer.
  2. Trascina la "nuova" versione della tabella nel diagramma .dbml (report1 nell'immagine seguente).

report1 è la nuova versione della tabella

  1. Contrassegna le colonne aggiunte nella nuova versione della tabella, premi Ctrl+ Cper copiare le colonne aggiunte.

copia le colonne aggiunte

  1. Fai clic sulla versione "vecchia" della tabella e premi Ctrl+ Vper incollare le colonne aggiunte nella versione già presente della tabella.

incolla le colonne aggiunte nella vecchia versione della tabella


4
Questo sembra essere il metodo più semplice, meno distruttivo che non richiede strumenti extra e funziona perfettamente in VS2017
Toby,

1
Questo è molto meno invadente della risposta accettata e continua a funzionare bene alla fine del 2018!
Segna il

1
Questa è la risposta migliore per modifiche rapide (e non così rapide allo schema). Ho impiegato molto tempo a rendere bella la vista del modello. Odiavo cancellare e trascinare i file di aggiornamento. Per i campi aggiunti funziona alla grande!
Hucker,

1
Per me, questo ha risolto due problemi. Il primo è stato quando ho provato a copiare e incollare un campo simile all'interno della tabella e poi a rinominarlo. Ciò ha creato un errore di build "non specificato" non-stop durante la convalida. L'altro problema era che se avessi rimosso la tabella e poi l'avessi aggiunta nella sua interezza, si sarebbero verificate differenze molto più grandi in git (poiché gli oggetti erano riorganizzati all'interno del file). Con questo metodo, vedo solo l'inserimento del nuovo campo, che è molto più pulito e più facile da capire in seguito.
goug

A proposito, è necessario fare clic su "Sì" quando viene richiesto "Gli oggetti che si stanno aggiungendo al progettista utilizzano una connessione dati diversa rispetto al progettista ..."
Eitanmg

5

Puoi anche dare un'occhiata al set PLINQO di modelli di generazione del codice, basato su CodeSmith, che ti consente di fare molte cose interessanti per e con Linq-to-SQL:

  • genera un file per classe (anziché un singolo file enorme)
  • aggiorna il tuo modello secondo necessità
  • molte altre funzionalità

Dai un'occhiata al sito PLINQO su http://www.plinqo.com e dai un'occhiata ai video introduttivi.

Il secondo strumento che conosco sono gli strumenti Huagati DBML / EDMX , che consentono l'aggiornamento dei file di mapping DBML (Linq-to-SQL) ed EDMX (Entity Framework) e altro (come convenzioni di denominazione ecc.).

Marc


Avendo appena strappato CodeSmith / PLINQO Vi consiglio vivamente contro questo approccio. Concesso questa risposta ha più di 4 anni ...
Yuck

@Yuck: a questo punto, sconsiglioi vivamente di usare Linq-to-SQL - usa invece Entity Framework, scelta molto migliore!
marc_s,

Sì. Passare a EF dopo aver verificato che l'applicazione avrebbe funzionato con un semplice DBML invece di PLINQO è stato il passo successivo che ho fatto per rispolverare una vecchia applicazione.
Yuck,

4

Utilizziamo un modello T4 scritto personalizzato che esegue una query dinamica del modello information_schema per ogni tabella in tutti i nostri file .DBML, quindi sovrascrive parti del file .DBML con nuove informazioni sullo schema dal database. Io altamenteconsiglio di implementare una soluzione come questa: mi ha risparmiato una gran quantità di tempo e, a differenza dell'eliminazione e della re-aggiunta delle tue tabelle al tuo modello, riesci a mantenere le tue associazioni. Con questa soluzione, otterrai errori di compilazione quando lo schema cambia. Tuttavia, devi assicurarti di utilizzare un sistema di controllo della versione, perché la differenza è davvero utile. Questa è un'ottima soluzione che funziona bene se stai sviluppando con un primo approccio di schema DB. Naturalmente, non posso condividere il codice della mia azienda, quindi sei da solo per averlo scritto tu stesso. Ma se conosci Linq-to-XML e puoi andare a scuola con questo progetto , puoi arrivare dove vuoi.


2

Consiglierei di usare il visual designer integrato in VS2008, poiché l'aggiornamento del dbml aggiorna anche il codice che viene generato per te. La modifica del dbml all'esterno del visual designer comporterebbe la mancata sincronizzazione del codice sottostante.


4
Sì, ma il visual designer in VS2008 non è in grado di rilevare e rispondere ai cambiamenti nel database sottostante :-( A parte l'eliminazione e la re-aggiunta, non c'è supporto per l'aggiornamento del modello :-(
marc_s

Sebbene ciò sia vero, la domanda era molto vaga e non menzionava specificamente come aggiornare un modello quando il database cambia.
Jason Miesionczek il

2

Esiste una sfumatura nell'aggiornamento delle tabelle e nell'aggiornamento del DBML ... Le relazioni con le chiavi esterne non vengono sempre immediatamente ripristinate se vengono apportate modifiche alle tabelle esistenti. Il problema consiste nel creare un progetto e quindi aggiungere nuovamente le tabelle. Ho segnalato questo a MS e il suo problema è stato risolto per VS2010.

La visualizzazione DBML non mostra nuovi vincoli di chiave esterna


Si noti che le istruzioni fornite nella risposta principale non sono chiare. Per aggiornare la tabella

  1. Apri l'area di progettazione dbml
  2. Seleziona tutte le tabelle con Right-> Click-> Select All o CTRLa
  3. CTRLx (Tagliare)
  4. CTRLv (Incolla)
  5. Salva e ricostruisci la soluzione.

Non credo che sia risolto, perché il relativo connect.microsoft.com/VisualStudio/feedback/details/414601/… non è stato risolto
Michael Freidgeim,

Apportate le modifiche prima o dopo averlo incollato?
Kolob Canyon,

Sono passati 10 anni ... ma credo che sia prima ... fai i cambiamenti e vai al n. 2.
ΩmegaMan

1

Nel caso dell'aggiornamento della procedura memorizzata, è necessario eliminarlo dal file .dbml e reinserirlo di nuovo. Ma se la procedura memorizzata ha due percorsi (es: if qualcosa; visualizza alcune colonne; altrimenti mostra altre colonne), assicurati che i due percorsi abbiano gli stessi alias di colonne !!! In caso contrario, saranno presenti solo le colonne del primo percorso.


0

Ecco il metodo passo-passo completo che ha funzionato per me al fine di aggiornare il dbml LINQ to SQL e i file associati per includere una nuova colonna che ho aggiunto a una delle tabelle del database.

È necessario apportare le modifiche alla superficie del progetto come suggerito da altri precedenti; tuttavia, è necessario eseguire alcuni passaggi aggiuntivi. Questi sono i passaggi completi:

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!).
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.