5

Tôi đã cấu trúc lại dự án của mình dẫn đến thay đổi tên không gian tên của ngữ cảnh cơ sở dữ liệu và cấu hình Mã đầu tiên liên quan. Tại thời điểm đó, tôi đã có một bản di chuyển được dàn dựng, "InitialCreate" và do đó bảng cơ sở dữ liệu của tôi là __MigrationHistory chứa một hàng đơn lẻ với một số MigrationIdContextKey có chứa tên không gian tên và tên lớp của lớp Configuration.Di chuyển giàn giáo với thay đổi phím ngữ cảnh

Sau khi tôi di chuyển mọi thứ, thực hiện Get-Migrations không trả lại kết quả, sau khi thay đổi ContextKey theo lời khuyên của đồng nghiệp của tôi, di chuyển "InitialCreate" được liệt kê chính xác.

Tôi nên thực hiện các bước nào trong quá trình thay đổi để tính di chuyển liên tục của tôi không bị hỏng, ngăn ngừa việc đổi tên ContextKey bằng tay? Rõ ràng, đó là không có vấn đề lớn đối với một di chuyển ứng dụng, tuy nhiên nó sẽ là một nỗi đau lớn để làm cho hàng chục di cư được áp dụng.

Trả lời

12

Tôi bị kẹt trong thời gian dài và được hỏi và trả lời here. Trong các tài liệu EF bạn có thể tìm ra lời giải thích về các phím bối cảnh here Bạn sẽ vào tạo cấu hình di chuyển tùy chỉnh như thế này:

public class MyMigrationConfiguration : DbMigrationsConfiguration<MyMigrationContext> 
{ 
    public MyMigrationConfiguration() 
    { 
     AutomaticMigrationsEnabled = false; 
     AutomaticMigrationDataLossAllowed = false; 
     MigrationsNamespace = "My.Migrations.Assembly"; 
     MigrationsDirectory = "My/Migrations/Directory"; 
     ContextKey = "MyContexKey"; // You MUST set this for every migration context 
    } 
} 
+0

Cảm ơn thông tin chi tiết, tôi chắc chắn sẽ ghi nhớ điều này. –

3

Tôi đã học được rằng lớp DbMigrationsConfiguration{TDbContext} có thuộc tính được gọi là ContextKey (EF6 và tính năng "di chuyển nhiều người thuê nhà") cho phép tôi đặt rõ ràng khóa ngữ cảnh. Thuộc tính này sẽ được đặt nếu tôi đã sử dụng tham số -ContextTypeName của lệnh Enable-Migrations trong Bảng điều khiển Trình quản lý gói. Có vẻ như phím ngữ cảnh có thể được thay đổi sau khi di chuyển đầu tiên được áp dụng, tuy nhiên với tùy chọn đặt khóa ngữ cảnh theo cách này sau khi tên loại lớp cấu hình đã thay đổi, gần như không cần thiết nếu bạn có thể chịu đựng một số khác biệt trong cơ sở dữ liệu của bạn.

2

tôi có hai dự án cơ sở dữ liệu tách - một trong có chứa mô hình và lập bản đồ, một khác chỉ chứa cấu hình di cư và tất cả di chuyển. Tôi đã sáp nhập dự án chứa di cư vào mô hình có chứa dự án, vv

Cuối cùng tôi giải quyết vấn đề với bất khả thi để thêm di cư mới hoặc giữ cơ sở dữ liệu được cập nhật hoặc di chuyển đồ về trạng thái trước bằng cách làm những bước sau:

  • Tôi đã thay đổi không gian tên trong dự án đã hợp nhất thành tất cả các di chuyển và cấu hình chính nó thành giá trị không gian tên mới.
  • tôi thực hiện tuyên bố sau đây đối với cơ sở dữ liệu:

    USE [DatabaseName] 
    
    GO 
    
    UPDATE [dbo].[__MigrationHistory] 
        SET [ContextKey] = N'NewNamepacePlusConfigurationClassName'  
    WHERE ContextKey= N'NamepacePlusConfigurationClassName' 
    
    GO 
    
  • tôi xây dựng dự án có chứa di cư với cấu hình

Bây giờ mọi thứ hoạt động như mong đợi, tôi thậm chí có thể thay đổi schema ngược sử dụng tuyên bố

Update-Database -TargetMigration PreviousMigration 
+0

nếu cột không tồn tại trong _MirtationHistory thì sao? –