7

Đây là một câu hỏi dài, nhưng tôi sẽ rất biết ơn nếu tôi có thể nhận được một số lời khuyên tốt về điều này. Tóm lại, tôi đang tìm cách tiếp cận tốt để nâng cấp phiên bản lược đồ cơ sở dữ liệu MS SQL cũng yêu cầu dữ liệu được di chuyển từ các bảng đã xóa sang các bảng mới.Làm thế nào để tránh mất dữ liệu với EF Model First schema schema database?

Tôi cho rằng Stack Overflow là nơi thích hợp nhất cho câu hỏi này (không phải là dba.stackexchange.com) vì cốt lõi của nó, đây là vấn đề đối với các nhà phát triển .NET sử dụng Entity Framework và các phần cơ sở dữ liệu của phần này bao gồm tập lệnh sql được tạo tự động.


nền

Một ứng dụng .NET và cơ sở dữ liệu SQL đang chạy trong Azure (Các ứng dụng trong vai trò người lao động và các cơ sở dữ liệu SQL Azure). Cho đến bây giờ, các nâng cấp phiên bản đã hoạt động tốt, bởi vì tất cả các thay đổi lược đồ cơ sở dữ liệu đơn giản (như thêm một cột mới). Tuy nhiên, từ bây giờ tôi cũng cần phải đối phó với việc di chuyển dữ liệu từ bảng này sang bảng khác trong quá trình nâng cấp. (Tôi có thể sửa lỗi tạm thời này bằng cách tạo cơ sở dữ liệu mới, tạo tập lệnh có dữ liệu từ cơ sở dữ liệu cũ và chỉnh sửa tập lệnh theo cách thủ công để phù hợp với giản đồ mới, nhưng tôi hy vọng có cách tiếp cận tốt hơn).

Tôi sử dụng Khung thực thể và tôi sử dụng Mẫu đầu tiên. Các thực thể và các hiệp hội được định nghĩa trong Visual Studio Data Model Designer và cách tiếp cận này rất phù hợp với ứng dụng của tôi.

tôi sử dụng một dacpac để nâng cấp cơ sở dữ liệu SQL Azure, và cách tiếp cận này đã làm việc tốt cho đến bây giờ (nhưng bây giờ tôi sẽ nhận được sự mất mát dữ liệu, vì vậy bây giờ tôi phải tìm một cách để di chuyển dữ liệu vào các bảng mới).

Tôi hy vọng tôi có thể tiếp tục sử dụng khung thực thể và xác định các thực thể/hiệp hội trong nhà thiết kế, nhưng tốt hơn là chuyển từ nâng cấp dacpac sang công nghệ khác nếu cần.

Nâng cấp cách tiếp cận đến nay

  1. tôi thêm đối tượng mới (bảng), các hiệp hội (quan hệ) và tài sản (cột) trong thiết kế.
  2. Tôi nhấp chuột phải, chọn “Tạo cơ sở dữ liệu từ mô hình…” và điều này dẫn đến tập lệnh .sql thả các đối tượng cơ sở dữ liệu cũ và tạo các đối tượng cơ sở dữ liệu mới.
  3. Tôi tạo cơ sở dữ liệu trống và chạy tập lệnh để tạo bảng/khóa, v.v.
  4. Trong SQL Server Management Studio, tôi bấm chuột phải vào cơ sở dữ liệu và chọn “Công việc -> Trích xuất ứng dụng tầng dữ liệu…”. Khi thuật sĩ hoàn thành tôi nhận được dacpac tôi cần (Thực ra bây giờ tôi có thể xóa cơ sở dữ liệu, vì tôi chỉ tạo nó để có thể lấy tệp dacpac, vì tôi không nghĩ mình có thể tạo nó trong Visual Studio Data Model Designer) .
  5. Tôi bấm chuột phải vào cơ sở dữ liệu Azure SQL và chọn "Công việc -> Nâng cấp ứng dụng tầng dữ liệu ..." và làm theo hướng dẫn. Cho đến bây giờ tôi chưa bao giờ mất dữ liệu, vì vậy điều này đã làm việc tốt!

trạng

Đây là một ví dụ đơn giản để minh họa cho vấn đề này, nhưng tôi sẽ nhận được vào những tình huống gần như giống hệt khá thường xuyên từ bây giờ có vẻ như. Nhìn vào phiên bản cũ và phiên bản mới của lược đồ trong hình bên dưới. Giả sử đã có dữ liệu trong cơ sở dữ liệu. Tôi cần dữ liệu trong ImageFile để kết thúc trong ImageFileOriginal hoặc ImageFileProcessed tùy thuộc vào giá trị boolean/bit IsOriginal. Sử dụng "Nâng cấp ứng dụng tầng dữ liệu" Tôi sẽ nhận được cảnh báo về mất dữ liệu. Bạn sẽ đề xuất phương pháp nào để giải quyết vấn đề này?Như tôi đã nói trước đó, bạn nên chuyển từ nâng cấp dacpac sang công nghệ khác nếu cần.

Old schema New schema

Tôi đã đọc về Visual Studio Dự án Cơ sở dữ liệu, thạo Migrator, Red Gate và Entity thiết kế cơ sở dữ liệu thế hệ Power Pack (Nó không hỗ trợ Visual Studio 2012), nhưng tôi đã không tìm thấy một cách tốt cho việc này. Tôi thừa nhận tôi đã không dành cả ngày để đào sâu vào từng công nghệ, nhưng tôi đã dành chút thời gian để thử tìm một cách tiếp cận tốt.

Trả lời

0

Trong lớp Configuration thiết lập các nhà xây dựng như sau:

public Configuration() 
{ 
    AutomaticMigrationsEnabled = true; 
    AutomaticMigrationDataLossAllowed = false; 
} 

Đặt AutomaticMigrationEnabled tài sản để true nghĩa là chúng ta đang sử dụng mã tự động di cư đầu tiên và một tài sản AutomaticMigrationDataLossAllowed được thiết lập để false, có nghĩa là trong quá trình chuyển không có dữ liệu hiện có bị mất từ ​​đó di cư của các bảng của cơ sở dữ liệu.

Toàn bộ lớp Configuration như sau.

Các vấn đề liên quan