Wie aktualisiere ich eine Linq to SQL-Datenbankdatei?

204

Wie aktualisiere ich eine Linq auf SQL .dbml-Datei?

Ante
quelle

Antworten:

258

Es gibt drei Möglichkeiten, das Modell synchron zu halten.

  1. Löschen Sie die geänderten Tabellen aus dem Designer und ziehen Sie sie aus dem Datenbank-Explorer zurück auf die Designer-Oberfläche. Ich habe festgestellt, dass Sie, damit dies zuverlässig funktioniert, Folgendes tun müssen:

    ein. Aktualisieren Sie das Datenbankschema im Datenbank-Explorer (Rechtsklick, Aktualisieren).
    B. Speichern Sie den Designer nach dem Löschen der Tabellen.
    C. Speichern Sie erneut, nachdem Sie die Tabellen zurückgezogen haben.

    Beachten Sie jedoch, dass wenn Sie Eigenschaften geändert haben (z. B. die untergeordnete Eigenschaft einer Zuordnung deaktivieren), diese Änderungen offensichtlich verloren gehen - Sie müssen sie erneut vornehmen.

  2. Verwenden Sie SQLMetal, um das Schema aus Ihrer Datenbank neu zu generieren. Ich habe eine Reihe von Blog-Posts gesehen, die zeigen, wie man dies schreibt .

  3. Nehmen Sie Änderungen direkt im Eigenschaftenbereich der DBML vor. Dies funktioniert für einfache Änderungen, z. B. das Zulassen von Nullen in einem Feld.

Der DBML-Designer wird in Visual Studio 2015, 2017 oder 2019 nicht standardmäßig installiert. Sie müssen VS schließen, das VS-Installationsprogramm starten und Ihre Installation ändern. Die LINQ to SQL-Tools müssen installiert werden. Für VS 2017/2019 finden Sie es unter Einzelkomponenten> Code-Tools .

Robert Harvey
quelle
1
Ich hatte 1a und 1c ohne 1b ausprobiert und erhielt beim Ausführen einer einfachen Auswahl für eine Ansicht die Fehlermeldung "Angegebene Besetzung ist nicht gültig". Einschließlich 1b behoben es für mich
Tomfumb
6
Die VS - Träger wurde auf die angeforderte connect.microsoft.com/VisualStudio/feedback/details/260723/... , aber MS wollen nicht fix.
Michael Freidgeim
Versuchte die erste Methode und es hat funktioniert. Ich denke, es wird für eine kleine DB funktionieren.
Muhammedh
Es schmerzt mich, dass ich Ende 2019 eine Antwort brauchte, bevor ich wusste, was Computerprogrammierung ist ... Das ist so detailliert und großartig!
PSGuy
54

Gehen Sie folgendermaßen vor, um eine Tabelle in Ihrem DBML-Diagramm mit beispielsweise hinzugefügten Spalten zu aktualisieren:

  1. Aktualisieren Sie Ihr SQL Server Explorer-Fenster.
  2. Ziehen Sie die "neue" Version Ihrer Tabelle in das DBML-Diagramm (Bericht1 im Bild unten).

report1 ist die neue Version der Tabelle

  1. Markieren Sie die hinzugefügten Spalten in der neuen Version der Tabelle und drücken Sie Ctrl+, Cum die hinzugefügten Spalten zu kopieren.

Kopieren Sie die hinzugefügten Spalten

  1. Klicken Sie auf die "alte" Version Ihrer Tabelle und drücken Sie Ctrl+, Vum die hinzugefügten Spalten in die bereits vorhandene Version der Tabelle einzufügen.

Fügen Sie die hinzugefügten Spalten in die alte Version der Tabelle ein

M463
quelle
4
Dies scheint die einfachste und am wenigsten zerstörerische Methode zu sein, die keine zusätzlichen Werkzeuge erfordert und in VS2017
Toby
1
Dies ist viel weniger aufdringlich als die akzeptierte Antwort und funktioniert auch Ende 2018 noch gut!
Mark
1
Dies ist die beste Antwort für schnelle (und nicht so schnelle Änderungen am Schema). Ich habe viel Zeit gebraucht, um die Modellansicht schön aussehen zu lassen. Ich hasste es, Update-Dateien zu löschen und zu ziehen. Für hinzugefügte Felder funktioniert dies hervorragend!
Hucker
1
Für mich löste dies zwei Probleme. Das erste war, als ich versuchte, ein ähnliches Feld in die Tabelle zu kopieren, einzufügen und dann umzubenennen. Dies führte bei der Validierung zu einem ununterbrochenen "nicht spezifizierten" Buildfehler. Das andere Problem war, dass wenn ich die Tabelle entfernte und sie dann wieder vollständig hinzufügte, dies zu viel größeren Unterschieden in git führte (weil Objekte innerhalb der Datei neu angeordnet wurden). Bei dieser Methode sehe ich nur das Einfügen des neuen Feldes, das viel sauberer und später leichter zu verstehen ist.
Goug
Übrigens müssen Sie auf "Ja" klicken, wenn Sie aufgefordert werden, "Die Objekte, die Sie dem Designer hinzufügen, verwenden eine andere Datenverbindung als der Designer ..."
Eitanmg
5

Sie könnten auch die Besuche PLINQO Satz von Codegenerierungsvorlagen, basierend auf Codesmith, die Ihnen erlauben , für und mit Linq-to-SQL viele nette Dinge zu tun:

  • Generieren Sie eine Datei pro Klasse (anstelle einer einzelnen, großen Datei).
  • Aktualisieren Sie Ihr Modell nach Bedarf
  • viele weitere Funktionen

Besuchen Sie die PLINQO-Website unter http://www.plinqo.com und sehen Sie sich die Intro-Videos an.

Das zweite mir bekannte Tool sind die Huagati DBML / EDMX-Tools , mit denen die Aktualisierung von DBML-Zuordnungsdateien (Linq-to-SQL) und EDMX-Zuordnungsdateien (Entity Framework) und mehr (wie Namenskonventionen usw.) ermöglicht wird.

Marc

marc_s
quelle
Nachdem raten gerade herausgerissen Codesmith / PLINQO ich stark gegen diesen Ansatz. Zugegeben, diese Antwort ist über 4 Jahre alt ...
Yuck
@Yuck: Zu diesem Zeitpunkt würde ich dringend davon abraten, Linq-to-SQL überhaupt zu verwenden - verwenden Sie stattdessen Entity Framework, eine viel bessere Wahl!
marc_s
Ja, so ist es. Der Wechsel zu EF, nachdem überprüft wurde, ob die Anwendung mit einem einfachen DBML anstelle von PLINQO funktioniert, war der nächste Schritt, den ich unternahm, um eine alte Anwendung abzuwischen.
Yuck
4

Wir verwenden eine benutzerdefinierte geschriebene T4-Vorlage, die das Modell information_schema für jede Tabelle in allen unseren DBML-Dateien dynamisch abfragt und dann Teile der DBML-Datei mit neuen Schemainformationen aus der Datenbank überschreibt. Ich hochIch empfehle die Implementierung einer solchen Lösung - sie hat mir Unmengen an Zeit gespart und im Gegensatz zum Löschen und erneuten Hinzufügen Ihrer Tabellen zu Ihrem Modell können Sie Ihre Assoziationen beibehalten. Mit dieser Lösung erhalten Sie Fehler bei der Kompilierung, wenn sich Ihr Schema ändert. Sie möchten jedoch sicherstellen, dass Sie ein Versionskontrollsystem verwenden, da Unterschiede sehr praktisch sind. Dies ist eine großartige Lösung, die gut funktioniert, wenn Sie mit einem ersten Ansatz für ein DB-Schema entwickeln. Natürlich kann ich den Code meines Unternehmens nicht teilen, daher sind Sie allein, um diesen Code selbst zu schreiben. Wenn Sie jedoch mit Linq-to-XML vertraut sind und mit diesem Projekt zur Schule gehen können , können Sie dorthin gelangen, wo Sie sein möchten.

mattmc3
quelle
2

Ich würde empfehlen, den in VS2008 integrierten visuellen Designer zu verwenden, da durch das Aktualisieren der Datenbank auch der für Sie generierte Code aktualisiert wird. Das Ändern der Datenbank außerhalb des visuellen Designers würde dazu führen, dass der zugrunde liegende Code nicht synchron ist.

Jason Miesionczek
quelle
4
Ja, aber der visuelle Designer in VS2008 kann Änderungen in Ihrer zugrunde liegenden Datenbank nicht erkennen und darauf reagieren :-( Ohne das Löschen und erneute Hinzufügen wird das Aktualisieren Ihres Modells nicht unterstützt :-(
marc_s
Obwohl dies zutrifft, war die Frage sehr vage und erwähnte nicht speziell, wie ein Modell aktualisiert werden kann, wenn sich die Datenbank ändert.
Jason Miesionczek
2

Das Aktualisieren von Tabellen und das Aktualisieren der DBML hat eine Nuance ... Fremdschlüsselbeziehungen werden nicht immer sofort übernommen, wenn Änderungen an vorhandenen Tabellen vorgenommen werden. Die Problemumgehung besteht darin, ein Projekt zu erstellen und die Tabellen dann erneut hinzuzufügen. Ich habe dies MS gemeldet und es wurde für VS2010 behoben.

In der DBML-Anzeige werden keine neuen Fremdschlüsseleinschränkungen angezeigt


Beachten Sie, dass die Anweisungen in der Hauptantwort nicht klar sind. So aktualisieren Sie die Tabelle

  1. Öffnen Sie die dbml-Designoberfläche
  2. Wählen Sie alle Tabellen mit Rechts-> Klicken-> Alle auswählen oder CTRLa
  3. CTRLx (Schnitt)
  4. CTRLv (Einfügen)
  5. Lösung speichern und neu erstellen.
ΩmegaMan
quelle
Ich glaube nicht, dass es behoben ist, weil verwandte connect.microsoft.com/VisualStudio/feedback/details/414601/… nicht behoben ist
Michael Freidgeim
Nehmen Sie Ihre Änderungen vor oder nach dem Ausschneiden und Einfügen vor?
Kolob Canyon
Es ist 10 Jahre her ... aber ich glaube, dass es vorher ist ... mach die Änderungen und gehe dann zu # 2.
ΩmegaMan
1

Im Falle einer Aktualisierung der gespeicherten Prozedur sollten Sie diese aus der DBML-Datei löschen und erneut einfügen. Wenn die gespeicherte Prozedur jedoch zwei Pfade hat (z. B. wenn etwas; einige Spalten anzeigen; andernfalls andere Spalten anzeigen), stellen Sie sicher, dass die beiden Pfade dieselben Spalten-Aliase haben !!! Andernfalls sind nur die ersten Pfadspalten vorhanden.

Yasser Hosny Abu Elmakarem
quelle
0

Hier ist die vollständige Schritt-für-Schritt-Methode, die für mich funktioniert hat, um die LINQ auf SQL-Datenbank und zugehörige Dateien zu aktualisieren und eine neue Spalte aufzunehmen, die ich einer der Datenbanktabellen hinzugefügt habe.

Sie müssen die Änderungen an Ihrer Entwurfsoberfläche vornehmen, wie von anderen oben vorgeschlagen. Sie müssen jedoch einige zusätzliche Schritte ausführen. Dies sind die vollständigen Schritte:

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
quelle