Làm cách nào để cập nhật tệp dbml Linq thành SQL?


204

Làm cách nào để cập nhật tệp Linq thành SQL .dbml?

Câu trả lời:


258

Có ba cách để giữ cho mô hình đồng bộ.

  1. Xóa các bảng đã sửa đổi khỏi trình thiết kế và kéo chúng trở lại bề mặt trình thiết kế từ Database Explorer. Tôi đã thấy rằng, để điều này hoạt động đáng tin cậy, bạn phải:

    a. Làm mới lược đồ cơ sở dữ liệu trong Database Explorer (nhấp chuột phải, làm mới)
    b. Lưu người thiết kế sau khi xóa các bảng
    c. Lưu lại sau khi kéo các bảng trở lại.

    Lưu ý rằng nếu bạn đã sửa đổi bất kỳ thuộc tính nào (ví dụ: tắt thuộc tính con của liên kết), điều này rõ ràng sẽ mất các sửa đổi đó - bạn sẽ phải thực hiện lại chúng.

  2. Sử dụng SQLMetal để tạo lại lược đồ từ cơ sở dữ liệu của bạn. Tôi đã thấy một số bài viết trên blog chỉ ra cách viết kịch bản này .

  3. Thay đổi trực tiếp trong ngăn Thuộc tính của DBML. Điều này hoạt động cho các thay đổi đơn giản, như cho phép null trên một trường.

Trình thiết kế DBML không được cài đặt theo mặc định trong Visual Studio 2015, 2017 hoặc 2019. Bạn sẽ phải đóng VS, khởi động trình cài đặt VS và sửa đổi cài đặt của bạn. Các công cụ LINQ to SQL là tính năng bạn phải cài đặt. Đối với VS 2017/2019, bạn có thể tìm thấy nó trong Các thành phần riêng lẻ> Công cụ mã .


1
Tôi đã thử 1a và 1c mà không có 1b và nhận được lỗi 'Chỉ định diễn viên không hợp lệ' khi thực hiện một lựa chọn đơn giản trên chế độ xem. Bao gồm 1b đã sửa nó cho tôi
tomfumb 29/11/11

6
Sự hỗ trợ VS đã được yêu cầu trên connect.microsoft.com/VisualStudio/feedback/details/260723/... , nhưng MS không muốn sửa chữa.
Michael Freidgeim

Đã thử phương pháp đầu tiên và nó đã làm việc. Đoán nó sẽ làm việc cho một DB nhỏ.
Muhammedh

Điều khiến tôi đau lòng là vào cuối năm 2019, tôi cần một câu trả lời được tạo ra trước khi tôi biết lập trình máy tính là gì ... Điều này rất chi tiết và tuyệt vời!
PSGuy

54

Để cập nhật một bảng trong sơ đồ .dbml của bạn, ví dụ, các cột đã thêm, hãy làm điều này:

  1. Cập nhật cửa sổ SQL Server Explorer của bạn.
  2. Kéo phiên bản "mới" của bảng của bạn vào sơ đồ .dbml (báo cáo1 trong hình bên dưới).

báo cáo1 là phiên bản mới của bảng

  1. Đánh dấu các cột được thêm vào trong phiên bản mới của bảng, nhấn Ctrl+ Cđể sao chép các cột đã thêm.

sao chép các cột được thêm vào

  1. Nhấp vào phiên bản "cũ" của bảng của bạn và nhấn Ctrl+ Vđể dán các cột đã thêm vào phiên bản đã có của bảng.

dán các cột đã thêm vào phiên bản cũ của bảng


4
Đây dường như là phương pháp dễ nhất, ít phá hủy nhất mà không cần thêm công cụ và chỉ hoạt động tốt trong VS2017
Toby

1
Điều này ít xâm phạm hơn nhiều so với câu trả lời được chấp nhận và tiếp tục hoạt động tốt vào cuối năm 2018!
Đánh dấu

1
Đây là câu trả lời tốt nhất cho các chỉnh sửa nhanh (và không quá nhanh cho lược đồ). Tôi đã mất rất nhiều thời gian để làm cho mô hình xem đẹp. Tôi ghét xóa và kéo tập tin cập nhật hơn. Đối với các lĩnh vực được thêm vào này hoạt động tuyệt vời!
Hucker

1
Đối với tôi, điều này giải quyết hai vấn đề. Cái đầu tiên là khi tôi cố sao chép và dán một trường tương tự trong bảng và sau đó đổi tên nó. Điều đó tạo ra lỗi xây dựng "không xác định" không dừng khi xác thực. Vấn đề khác là nếu tôi loại bỏ bảng và sau đó thêm lại toàn bộ, nó sẽ dẫn đến sự khác biệt lớn hơn nhiều trong git (vì các đối tượng được sắp xếp lại trong tệp). Với phương pháp này, tôi chỉ thấy phần chèn của trường mới, sẽ sạch hơn và dễ hiểu hơn sau này.
goug

BTW, cần nhấp vào "Có" khi nó nhắc bạn "Các đối tượng bạn đang thêm vào trình thiết kế sử dụng kết nối dữ liệu khác với trình thiết kế ..."
Eitanmg

5

Bạn cũng có thể kiểm tra bộ mẫu tạo mã PLINQO , dựa trên CodeSmith, cho phép bạn thực hiện nhiều việc gọn gàng cho và với Linq-to-SQL:

  • tạo một tệp cho mỗi lớp (thay vì một tệp lớn
  • cập nhật mô hình của bạn khi cần thiết
  • nhiều tính năng khác

Kiểm tra trang web PLINQO tại http://www.plinqo.com và xem các video giới thiệu.

Công cụ thứ hai mà tôi biết là các công cụ Huagati DBML / EDMX , cho phép cập nhật các tệp ánh xạ DBML (Linq-to-SQL) và EDMX (Entity Framework), và nhiều hơn nữa (như quy ước đặt tên, v.v.).

Marc


Vừa tách ra CodeSmith / PLINQO Tôi khuyên chống lại dùng phương pháp này. Cấp câu trả lời này là hơn 4 tuổi ...
Yuck

@Yuck: tại thời điểm này, tôi thực sự khuyên bạn không nên sử dụng Linq-to-SQL - thay vào đó, hãy sử dụng Entity Framework, lựa chọn tốt hơn nhiều!
marc_s

Vâng, đúng vậy. Chuyển sang EF sau khi xác minh rằng ứng dụng sẽ hoạt động với DBML đơn giản thay vì PLINQO là bước tiếp theo tôi thực hiện để loại bỏ một ứng dụng cũ.
Yuck

4

Chúng tôi sử dụng mẫu T4 được viết tùy chỉnh, truy vấn động mô hình information_schema cho mỗi bảng trong tất cả các tệp .DBML của chúng tôi, sau đó ghi đè lên các phần của tệp .DBML bằng thông tin lược đồ mới từ cơ sở dữ liệu. Tôi đánh giá caokhuyên bạn nên thực hiện một giải pháp như thế này - nó đã giúp tôi tiết kiệm rất nhiều thời gian, và không giống như xóa và thêm lại các bảng của bạn vào mô hình của bạn, bạn có thể giữ các liên kết của mình. Với giải pháp này, bạn sẽ gặp lỗi thời gian biên dịch khi lược đồ của bạn thay đổi. Bạn muốn chắc chắn rằng bạn đang sử dụng một hệ thống kiểm soát phiên bản, bởi vì diffing thực sự tiện dụng. Đây là một giải pháp tuyệt vời hoạt động tốt nếu bạn đang phát triển với cách tiếp cận lược đồ DB đầu tiên. Tất nhiên, tôi không thể chia sẻ mã của công ty tôi để bạn tự mình viết mã này. Nhưng nếu bạn biết một số Linq-to-XML và có thể đi học trong dự án này , bạn có thể đến nơi bạn muốn.


2

Tôi khuyên bạn nên sử dụng trình thiết kế trực quan được tích hợp trong VS2008, vì cập nhật dbml cũng cập nhật mã được tạo cho bạn. Sửa đổi dbml bên ngoài trình thiết kế trực quan sẽ dẫn đến mã bên dưới không đồng bộ.


4
Vâng, nhưng nhà thiết kế hình ảnh trong VS2008 không thể phát hiện và phản hồi các thay đổi trong cơ sở dữ liệu cơ bản của bạn :-( Không xóa và thêm lại, không có hỗ trợ để cập nhật mô hình của bạn :-(
marc_s

Trong khi đó là sự thật, câu hỏi rất mơ hồ và không đề cập cụ thể đến cách cập nhật một mô hình khi cơ sở dữ liệu thay đổi.
Jason Miesionczek

2

Có một sắc thái đối với việc cập nhật các bảng sau đó cập nhật DBML ... Các mối quan hệ khóa ngoài không phải luôn luôn được đưa ra nếu các thay đổi được thực hiện cho các bảng hiện có. Công việc xung quanh là thực hiện xây dựng dự án và sau đó thêm lại các bảng. Tôi đã báo cáo điều này với MS và nó đã được sửa cho VS2010.

Hiển thị DBML không hiển thị các ràng buộc khóa ngoại mới


Lưu ý rằng các hướng dẫn được đưa ra trong câu trả lời chính là không rõ ràng. Để cập nhật bảng

  1. Mở bề mặt thiết kế dbml
  2. Chọn tất cả các bảng bằng Phải-> Nhấp vào-> Chọn Tất cả hoặc CTRLa
  3. CTRLx (Cắt)
  4. CTRLv (Dán)
  5. Lưu và xây dựng lại giải pháp.

Tôi không tin nó đã được sửa, bởi vì liên quan connect.microsoft.com/VisualStudio/feedback/details/414601/... không cố định
Michael Freidgeim

Bạn có thực hiện thay đổi của bạn trước hoặc sau khi bạn cắt và dán?
Hẻm núi Kolob

Đã 10 năm rồi ... nhưng tôi tin rằng đó là trước khi ... thực hiện các thay đổi sau đó chuyển sang # 2.
ΩmegaMan

1

Trong trường hợp cập nhật thủ tục được lưu trữ, bạn nên xóa nó khỏi tệp .dbml và đặt lại lần nữa. Nhưng nếu thủ tục được lưu trữ có hai đường dẫn (ví dụ: if Something; hiển thị một số cột; khác hiển thị một số cột khác), hãy đảm bảo hai đường dẫn có cùng một bí danh cột !!! Nếu không, chỉ có các cột đường dẫn đầu tiên sẽ tồn tại.


0

Đây là phương pháp từng bước hoàn chỉnh phù hợp với tôi để cập nhật LINQ thành SQL dbml và các tệp được liên kết để bao gồm một cột mới mà tôi đã thêm vào một trong các bảng cơ sở dữ liệu.

Bạn cần thực hiện các thay đổi cho bề mặt thiết kế của bạn theo đề xuất khác ở trên; tuy nhiên, bạn cần phải làm thêm một số bước. Đây là các bước hoàn chỉnh:

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!).
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.