Câu hỏi Làm cách nào để cập nhật tệp edmx với các thay đổi cơ sở dữ liệu?


Tôi có một tập tin edmx và tôi đã thay đổi một bảng trong cơ sở dữ liệu của mình. Tôi biết rằng có một thuật sĩ "Mô hình cập nhật từ cơ sở dữ liệu", tuy nhiên trong nhiều trường hợp, điều này là vô dụng.

Ví dụ nếu tôi thay đổi một trường từ non null thành nullable hoặc nếu tôi loại bỏ các trường thì mô hình cập nhật không phản ánh các thay đổi. Tôi đã phải loại bỏ các thực thể và thêm nó trở lại để có được những thay đổi xuất hiện trong mô hình của tôi.

Mỗi câu hỏi sau: Tôi làm cách nào để truyền các thay đổi cơ sở dữ liệu sang tệp .edmx của mình?

Một trong những câu trả lời có vẻ như là nói cùng một điều, rằng bạn cần phải loại bỏ thực thể và thêm nó trở lại.

Đây có phải là câu trả lời dứt khoát hay là có cách nào tốt hơn để làm điều này?


33
2018-03-14 18:45


gốc


có thể trùng lặp Cập nhật edmx của bạn để phản ánh các thay đổi được thực hiện trong db của bạn (.net linq-to-entity) - Tim Abell


Các câu trả lời:


Bước quan trọng đầu tiên là hiểu chính xác điều gì xảy ra khi bạn sử dụng trình hướng dẫn mô hình cập nhật.

Từ Thư viện MSDN:

Trình thiết kế mô hình dữ liệu thực thể ADO.NET (Entity Designer) sử dụng Trình hướng dẫn mô hình cập nhật để cập nhật tệp .edmx từ các thay đổi được thực hiện cho cơ sở dữ liệu. Trình hướng dẫn mô hình cập nhật sẽ ghi đè mô hình lưu trữ như là một phần của quá trình này. Trình hướng dẫn mô hình cập nhật cũng thực hiện một số thay đổi đối với mô hình khái niệm và ánh xạ, nhưng nó chỉ thực hiện các thay đổi này khi các đối tượng được thêm vào cơ sở dữ liệu. Ví dụ, các loại thực thể mới được thêm vào mô hình khái niệm khi các bảng được thêm vào cơ sở dữ liệu và các thuộc tính mới được thêm vào các kiểu thực thể khi các cột được thêm vào một bảng. Để biết chi tiết về những thay đổi được thực hiện đối với tệp .edmx, hãy xem Thay đổi được thực hiện cho tệp .edmx bằng Trình hướng dẫn mô hình cập nhật.

Khi bạn cập nhật cơ sở dữ liệu bằng cách sử dụng trình hướng dẫn mô hình cập nhật, nó đã cập nhật mô hình lưu trữ trong tệp .edmx chứ không phải mô hình khái niệm. Khi các thay đổi được thực hiện đối với định nghĩa của các đối tượng hiện có, chỉ có mô hình lưu trữ được cập nhật; mô hình khái niệm không được cập nhật. Để có mô tả đầy đủ về các thay đổi được thực hiện bởi trình hướng dẫn mô hình cập nhật, vui lòng xem liên kết "Các thay đổi được thực hiện cho tệp .edmx của Trình hướng dẫn mô hình cập nhật" ở trên.

Dưới đây là một số tùy chọn về cách cập nhật các đối tượng không được cập nhật bởi trình hướng dẫn mô hình cập nhật (dựa trên kịch bản của bạn, nơi định nghĩa cột đã bị thay đổi):

  1. Sử dụng trình hướng dẫn mô hình cập nhật (để cập nhật mô hình lưu trữ), mở tệp .edmx bằng cách sử dụng trình thiết kế (mặc định), tìm thuộc tính vô hướng mong muốn và chỉnh sửa các thuộc tính mong muốn trong cửa sổ Thuộc tính.
  2. Sử dụng trình hướng dẫn mô hình cập nhật (để cập nhật mô hình lưu trữ), mở tệp .edmx bằng trình soạn thảo XML, tìm thuộc tính mong muốn trong phần CSDL (mô hình khái niệm) và thay đổi các thuộc tính mong muốn. Về cơ bản, điều này giống như tùy chọn 1, nhưng bạn đang chỉnh sửa trực tiếp XML (tìm và thay thế có thể hữu ích ở đây).
  3. Từ Trình duyệt mô hình, xóa thực thể mong muốn khỏi phần Loại thực thể của mô hình khái niệm và bảng mong muốn từ phần Bảng / Lượt xem của mô hình lưu trữ. Sau đó, sử dụng trình hướng dẫn mô hình cập nhật để thêm lại.

Tùy chọn tốt nhất sẽ phụ thuộc vào kịch bản nhất định. Ví dụ: nếu bạn chỉ thay đổi định nghĩa của một cột, thì tùy chọn 1 có thể là lựa chọn tốt nhất của bạn. Nếu bạn thay đổi định nghĩa của một số cột trong một bảng, thì tùy chọn 3 có thể là lựa chọn tốt nhất của bạn. Nếu bạn thay đổi một cột được sử dụng trên một số bảng (chẳng hạn như khóa chính / khóa ngoài), thì việc chỉnh sửa XML .edmx trực tiếp có thể là lựa chọn tốt nhất của bạn.


30
2018-03-14 20:39



Tuyệt vời! rất chính xác! - Pramod Sharma
Đây là giá trị vàng! Cảm ơn bạn! - Ben
Cảm ơn vì điều này ... Đã học cách hoạt động ... Hầu hết thời gian, xóa bảng khỏi EDMX và sau đó cập nhật từ Cơ sở dữ liệu đã hoạt động cho tôi .. Bây giờ tôi đã biết tại sao - A3006


Cập nhật EDMX an toàn đường:

Như bạn đã tìm thấy, cập nhật từ cơ sở dữ liệu không phải lúc nào cũng thay đổi các thuộc tính hiện có một cách chính xác.

Từ việc sử dụng cập nhật EDMX hàng ngày của chúng tôi (100 cập nhật trong 24 tháng), tôi sẽ giới thiệu chuỗi sau để cập nhật EDMX.

Xóa mô hình hiện có và sau đó cập nhật:

  1. Mở trình thiết kế EDMX
  2. Ctrl-A để chọn tất cả
  3. Xóa khóa để xóa tất cả các mô hình trong trình thiết kế
  4. QUAN TRỌNG: Không lưu EDMX vào thời điểm này nếu bạn đang ở dưới sự kiểm soát nguồn! *
  5. Bây giờ nhấp chuột phải và chọn "Cập nhật Mô hình từ Cơ sở dữ liệu" để tạo lại toàn bộ mô hình.
  6. Xây dựng lại dự án để truyền bá những thay đổi

Điều này rõ ràng sẽ mất mọi chỉnh sửa thủ công mà bạn đã thực hiện cho mô hình, nhưng cần phải tránh các chỉnh sửa thủ công nếu có thể. Điều này làm cho toàn bộ quá trình tái sản xuất bất cứ lúc nào (đó là một điều tốt).

Lưu ý quan trọng:

  • Nếu bạn đã bật tự động lưu trong Visual Studio, bạn cần chọn bản cập nhật (bước 5 ở trên), nhanh chóng để tránh tự động lưu mọi thứ.
  • Nếu bạn đang kiểm soát nguồn, và xảy ra để lưu EDMX sau khi đổ nó, kiểm soát nguồn của bạn sẽ đánh dấu tất cả các tập tin được tạo ra là "xóa" và cập nhật EDMX một lần nữa có thể dẫn đến các tập tin bị ngắt kết nối không có trong kiểm soát nguồn!.
  • Quá trình này sẽ không cập nhật bất kỳ thủ tục được lưu trữ nào. Hơn nữa, tôi đã tìm thấy rằng một làm mới của một EDMX cũng sẽ không cập nhật các thủ tục lưu trữ mà chỉ loại trả về đã thay đổi (vẫn còn hiện tại như của EF 6.1.1).

Khuyến nghị bổ sung:

Giữ EDMX của bạn trong một thư viện riêng biệt. Điều này cũng trở thành một nơi tuyệt vời để thêm các tệp TT bổ sung và các lớp một phần (ví dụ: để mở rộng chức năng của các mô hình EDMX). Tôi cũng đặt bất kỳ phương thức mở rộng nào cho bối cảnh cơ sở dữ liệu trong thư viện này. Các migration các tệp được tạo trong thư viện cũng giữ tất cả các tệp được chứa độc đáo.

Cập nhật tháng 4 năm 2015

Bản phát hành 4 mới nhất của Visual Studio 2013 dường như đã giải quyết được rất nhiều vấn đề về TFS. Bây giờ chúng ta thấy Visual Studio checkout các tệp được tạo ra, sau đó hoàn nguyên chúng nếu chúng không thay đổi. Các bước trên vẫn có vẻ là phương pháp an toàn nhất.

Cập nhật tháng 9 năm 2015

Sử dụng phiên bản mới nhất của VS2013 Release 5, chúng tôi vẫn gặp sự cố nếu lưu xảy ra trong quá trình cập nhật EDMX. Bạn vẫn có thể cập nhật trạng thái trong đó các lần xóa đang chờ xử lý khiến bạn tt các tệp được bị xóa khỏi điều khiển nguồn trong khi cập nhật. Bí quyết là cập nhật nhanh giữa các bước 4 và 5! :)


51
2018-05-27 09:39



Có cách nào tốt để luôn luôn đặt StoreGeneratedPattern trên khóa chính của tôi để nhận dạng sau khi cập nhật mô hình từ cơ sở dữ liệu, bởi vì hoặc id của chúng tôi được mặc định newid () trên máy chủ sql. - Jerry Liang
@ JerryLiang: Như đã đề cập tất cả các chỉnh sửa tùy chỉnh cho EDMX bị mất làm điều này. Bạn phải làm việc với các thiết lập SQL mặc định, hoặc lặp lại các thay đổi tùy chỉnh của bạn sau mỗi lần cập nhật EDMX. Mặc định newid() chỉ nên áp dụng cho các bản ghi mới được chèn vào, vì vậy tôi không chắc chắn về sự khác biệt StoreGeneratedPattern = Identity thực sự làm. Có lẽ bạn có thể làm rõ? - Gone Coding
Có cách nào để thêm xuất khẩu của cấu trúc của cơ sở dữ liệu vào một tập tin sql, khi cập nhật edmx? - Bakudan
@ Bakudan: Nó không được thiết kế để đi qua lại, nhưng về mặt lý thuyết bạn có thể tạo ra mã đầu tiên cơ sở dữ liệu từ edmx các lớp được tạo. Bạn thường cần tạo một kịch bản tạo cơ sở dữ liệu với một công cụ như SQL Server Management Studio. - Gone Coding
@Gone Coding Cảm ơn bạn đã chia sẻ từng bước chi tiết này. Đối với những người như tôi đã đọc câu trả lời của Gone Coding quá muộn và đã thành công trong việc xóa / ngắt kết nối (các) tệp khỏi điều khiển nguồn, những gì tôi đã làm là thực hiện Undo Pending Changes trên edmx tệp (tốt nhất là toàn bộ lớp dữ liệu). Sau đó, tôi đã làm một Get Latest phiên bản. Điều gì đã xảy ra là của tôi tt (các) tệp hiện đã trở lại trong SC. Sau đó thực hiện các bước nêu trên. HTH. - Annie Lagang


Nếu tôi hiểu câu hỏi của bạn và ví dụ của bạn, khi bạn thực hiện mô hình cập nhật từ bước cơ sở dữ liệu và bạn đang ở đó trên sơ đồ Model.edmx, bạn có thể đánh dấu thuộc tính trong lớp mà bạn muốn thay đổi và hiển thị các thuộc tính trên nó và thay đổi thuộc tính Nullable cho nó thành Nullable: True. Đó là ít nhất một cách để làm điều này.

Tôi tin rằng ý tưởng ở đây là mô hình khái niệm (không được thay đổi từ không null thành nullable) thực sự có thể khác với bảng cơ sở dữ liệu bên dưới và do đó nó không thay đổi phần đó và sự khác biệt đó có thể chính xác như bạn dự định. Hai cách tôi xử lý này hoặc là làm việc loại bỏ & thêm như bạn đã đề cập hoặc thông thường hơn tôi tự thiết lập các thuộc tính như tôi đã đề cập.


1
2018-03-14 19:02



Vâng, tôi nghĩ rằng tôi làm theo những gì bạn nói. Trong trường hợp của tôi, tôi đã có một trường không nullable, làm cho tập tin edmx của tôi. Sau đó, tôi đã thay đổi thực thể thành vô giá trị. Sau đó nó phàn nàn rằng db không phải là nullable trong khi thực thể là. Vì vậy, tôi cập nhật db để được nullable là tốt và được sử dụng "Cập nhật mô hình từ cơ sở dữ liệu". Nhưng, như bạn đã lưu ý nó không thay đổi thuộc tính null / null. Trong trường hợp này, tôi không thể thay đổi thực thể mà không tạo ra lỗi. Vì vậy, tôi đã xóa và thêm lại thực thể và điều đó vẫn ổn. Không phải là một vấn đề lớn, nhưng tôi tự hỏi liệu có cách nào để làm điều này tốt hơn không. - dtc


Hãy xem xét tôi đã thêm một cột mới (c1) vào bảng hiện có của tôi. Sau đó, để cập nhật tương tự trong Mô hình thực thể hiện tại của tôi, tôi sẽ làm như sau.

Tôi sẽ mở tập tin .edmx trong notepad ++.

Tôi sẽ thêm thuộc tính c1 vào tệp .edmx khi cần thiết. Ví dụ, tôi sẽ thêm nút c1 bên dưới mỗi nút c0.

    <EntityType Name="table">
      <Key>
        <PropertyRef Name="Id" />
      </Key>
      <Property Name="Id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
      <Property Name="c0" Type="nvarchar(max)" />
      <Property Name="c1" Type="nvarchar(max)" />
    </EntityType> 

Tải lại dự án trong Visual studio.

Và cuối cùng thêm thuộc tính c1 vào mô hình.


1
2017-11-23 15:37





  1. Thứ nhất, nhấp đúp vào tập tin .edmx
  2. Thứ hai, Nhấp chuột phải vào vùng trống và chọn "Cập nhật mô hình từ cơ sở dữ liệu"
  3. Thứ ba, chọn tab Làm mới trên thanh trình đơn.
  4. Cuối cùng, chọn bảng bạn muốn làm mới và chọn Kết thúc ..

1
2018-03-29 13:33



Sai. Không có sự lựa chọn nào trên các bảng để làm mới - tất cả chúng đều được làm mới bằng cách sử dụng luồng được mô tả trong câu trả lời được chấp nhận. - Niklas Wulff