Jak zaktualizować plik dbq SQL do Linq?

204

Jak zaktualizować plik Linq do SQL .dbml?

Ante
źródło

Odpowiedzi:

258

Istnieją trzy sposoby synchronizacji modelu.

  1. Usuń zmodyfikowane tabele z projektanta i przeciągnij je z powrotem na powierzchnię projektanta z Eksploratora bazy danych. Przekonałem się, że aby to działało niezawodnie, musisz:

    za. Odśwież schemat bazy danych w Eksploratorze bazy danych (kliknij prawym przyciskiem myszy, odśwież)
    b. Zapisz projektanta po usunięciu tabel
    c. Zapisz ponownie po przeciągnięciu tabel z powrotem.

    Pamiętaj jednak, że jeśli zmodyfikowałeś jakieś właściwości (na przykład, wyłączając właściwość potomną powiązania), to oczywiście utracisz te modyfikacje - będziesz musiał je wprowadzić ponownie.

  2. Użyj SQLMetal, aby zregenerować schemat z bazy danych. Widziałem wiele postów na blogu, które pokazują, jak to zrobić .

  3. Wprowadź zmiany bezpośrednio w panelu Właściwości DBML. Działa to w przypadku prostych zmian, takich jak dopuszczanie wartości zerowych w polu.

Projektant DBML nie jest domyślnie instalowany w Visual Studio 2015, 2017 lub 2019. Będziesz musiał zamknąć VS, uruchomić instalator VS i zmodyfikować instalację. Narzędzia LINQ to SQL to funkcja, którą musisz zainstalować. W przypadku wersji VS 2017/2019 można go znaleźć w części Pojedyncze komponenty> Narzędzia kodu .

Robert Harvey
źródło
1
Próbowałem 1a i 1c bez 1b i otrzymywałem błędy „Określony rzut nie jest prawidłowy” podczas wykonywania prostego wyboru w widoku. W tym 1b naprawiłem to dla mnie
tomfumb
6
Wsparcie VS została wezwana na connect.microsoft.com/VisualStudio/feedback/details/260723/... , ale MS nie chce naprawić.
Michael Freidgeim
Wypróbowałem pierwszą metodę i zadziałała. Zgadnij, że zadziała dla małej bazy danych.
Muhammedh
Boli mnie, że pod koniec 2019 roku potrzebowałem odpowiedzi, zanim dowiedziałem się, co to jest programowanie komputerowe ... Jest tak szczegółowe i świetne!
PSGuy,
54

Aby zaktualizować tabelę na diagramie .dbml, na przykład dodając kolumny, wykonaj następujące czynności:

  1. Zaktualizuj okno Eksploratora SQL Server.
  2. Przeciągnij „nową” wersję swojej tabeli na diagram .dbml (raport 1 na obrazku poniżej).

raport1 to nowa wersja tabeli

  1. Zaznacz dodane kolumny w nowej wersji tabeli, naciśnij Ctrl+, Caby skopiować dodane kolumny.

skopiuj dodane kolumny

  1. Kliknij „starą” wersję tabeli i naciśnij Ctrl+, Vaby wkleić dodane kolumny do już istniejącej wersji tabeli.

wklej dodane kolumny do starej wersji tabeli

M463
źródło
4
To wydaje się być najłatwiejszą, najmniej destrukcyjną metodą, która nie wymaga żadnych dodatkowych narzędzi i działa dobrze w VS2017
Toby
1
Jest to znacznie mniej natrętne niż zaakceptowana odpowiedź i nadal działa dobrze pod koniec 2018 roku!
Mark
1
To najlepsza odpowiedź na szybkie (i nie tak szybkie zmiany w schemacie). Zajęło mi dużo czasu, aby widok modelu ładnie wyglądał. Nienawidziłem usuwania i przeciągania plików aktualizacji. W przypadku dodanych pól działa to świetnie!
Hucker
1
Dla mnie rozwiązało to dwa problemy. Pierwszy miał miejsce, gdy próbowałem skopiować i wkleić podobne pole w tabeli, a następnie zmienić jego nazwę. To spowodowało non-stop „nieokreślony” błąd kompilacji podczas sprawdzania poprawności. Innym problemem było to, że jeśli usunę tabelę, a następnie dodam ją z powrotem w całości, spowoduje to znacznie większe różnice w git (ponieważ obiekty są przestawiane w pliku). Dzięki tej metodzie widzę tylko wstawienie nowego pola, które jest znacznie czystsze i łatwiejsze do zrozumienia później.
goug
BTW, musisz kliknąć „Tak”, gdy pojawi się monit „Obiekty, które dodajesz do projektanta, używają innego połączenia danych niż projektant ...”
Eitanmg
5

Możesz również sprawdzić zestaw szablonów generowania kodu PLINQO , oparty na CodeSmith, które pozwalają ci robić wiele schludnych rzeczy dla Linq-to-SQL:

  • generuj jeden plik na klasę (zamiast jednego, dużego pliku)
  • w razie potrzeby zaktualizuj swój model
  • wiele innych funkcji

Sprawdź stronę PLINQO pod adresem http://www.plinqo.com i obejrzyj filmy wprowadzające.

Drugim narzędziem, które znam, są narzędzia Huagati DBML / EDMX , które umożliwiają aktualizację plików mapowania DBML (Linq-to-SQL) i EDMX (Entity Framework) i wiele innych (takich jak konwencje nazewnictwa itp.).

Marc

marc_s
źródło
Po prostu wyrwane CodeSmith / PLINQO Zdecydowanie zalecamy przed zastosowaniem tego podejścia. Przyznaję, że ta odpowiedź ma ponad 4 lata ...
Fuj
@ Yuck: w tym momencie zdecydowanie odradzam używanie Linq-SQL w ogóle - zamiast tego użyj Entity Framework, znacznie lepszy wybór!
marc_s
Tak to jest. Przejście do EF po sprawdzeniu, że aplikacja będzie działała ze zwykłym DBML zamiast PLINQO, było kolejnym krokiem do odkurzania starej aplikacji.
Fuj
4

Używamy niestandardowego napisanego szablonu T4, który dynamicznie odpytuje model Information_schema dla każdej tabeli we wszystkich naszych plikach .DBML, a następnie nadpisuje części pliku .DBML świeżymi informacjami o schemacie z bazy danych. Ja bardzozalecam wdrożenie takiego rozwiązania - zaoszczędziło mi to mnóstwo czasu, a w przeciwieństwie do usuwania i ponownego dodawania tabel do modelu, możesz zachować swoje skojarzenia. Dzięki temu rozwiązaniu będziesz otrzymywać błędy podczas kompilacji, gdy zmieni się twój schemat. Chcesz się upewnić, że używasz systemu kontroli wersji, ponieważ różnicowanie jest naprawdę przydatne. To świetne rozwiązanie, które działa dobrze, jeśli programujesz w oparciu o pierwsze podejście do schematu DB. Oczywiście nie mogę udostępniać kodu mojej firmy, więc jesteś sam, ponieważ sam to napisałeś. Ale jeśli znasz trochę Linq-to-XML i możesz iść do szkoły w tym projekcie , możesz dostać się tam, gdzie chcesz być.

mattmc3
źródło
2

Poleciłbym użycie projektanta wizualnego wbudowanego w VS2008, ponieważ aktualizacja pliku dbml aktualizuje również wygenerowany kod. Modyfikacja pliku dbml poza projektantem wizualnym spowodowałaby brak synchronizacji bazowego kodu.

Jason Miesionczek
źródło
4
Tak, ale projektant wizualny w VS2008 nie może wykrywać i reagować na zmiany w bazie danych leżącej :-( krótki usunięcie i ponowne dodanie, nie ma wsparcia dla aktualizacji modelu :-(
marc_s
Chociaż to prawda, pytanie było bardzo niejasne i nie wspomniało konkretnie o tym, jak zaktualizować model po zmianie bazy danych.
Jason Miesionczek
2

Uaktualnienie tabel, a następnie aktualizacja DBML jest niuansowe ... Relacje klucza obcego nie zawsze są natychmiast przenoszone, jeśli zostaną wprowadzone zmiany w istniejących tabelach. Obejście polega na wykonaniu kompilacji projektu, a następnie ponownym dodaniu tabel. Zgłosiłem to do MS i zostało to naprawione dla VS2010.

Wyświetlanie DBML nie pokazuje nowych ograniczeń klucza obcego


Pamiętaj, że instrukcje podane w głównej odpowiedzi nie są jasne. Aby zaktualizować tabelę

  1. Otwórz powierzchnię projektową dbml
  2. Wybierz wszystkie tabele, klikając Prawo-> Kliknij-> Wybierz wszystko lub CTRLa
  3. CTRLx (Skaleczenie)
  4. CTRLv (Pasta)
  5. Zapisz i odbuduj rozwiązanie.
ΩmegaMan
źródło
Nie wierzę, że zostało to naprawione, ponieważ związany z tym connect.microsoft.com/VisualStudio/feedback/details/414601/... nie jest naprawiony
Michael Freidgeim
Czy wprowadzasz zmiany przed czy po wycięciu i wklejeniu?
Kanion Kolob
Minęło 10 lat ... ale wierzę, że to było wcześniej ... dokonaj zmian, a następnie przejdź do # 2.
ΩmegaMan
1

W przypadku aktualizacji procedury składowanej należy ją usunąć z pliku .dbml i ponownie zainstalować. Ale jeśli procedura składowana ma dwie ścieżki (np. Jeśli coś; wyświetl niektóre kolumny; w przeciwnym razie wyświetl inne kolumny), upewnij się, że obie ścieżki mają takie same aliasy kolumn !!! W przeciwnym razie będą istnieć tylko pierwsze kolumny ścieżek.

Yasser Hosny Abu Elmakarem
źródło
0

Oto pełna metoda krok po kroku, która działała dla mnie w celu zaktualizowania LINQ do SQL dbml i powiązanych plików w celu włączenia nowej kolumny, którą dodałem do jednej z tabel bazy danych.

Musisz dokonać zmian na powierzchni projektowej, jak sugerują inne powyżej; musisz jednak wykonać dodatkowe czynności. Oto pełne kroki:

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
źródło