2013-07-29 30 views
20

Tôi đang làm việc với Entity Framework 5.0 Code First Migrations và đang gặp sự cố khi chạy Update-Database. Nó nói rằng có những thay đổi mô hình đang chờ xử lý; nhưng nó phải là up-to-date, vì vậy tôi chạyCập nhật-Cơ sở dữ liệu không thành công do Thay đổi đang chờ xử lý, nhưng việc thêm di chuyển tạo ra một di chuyển trùng lặp

Add-Migration SomeMigrationName 

và nó tạo ra một tập tin ... Tuy nhiên, nó tạo ra một tập tin trong đó chủ yếu là giống một bản sao của một Migration trước đó (nếu tôi cố gắng Cập nhật cơ sở dữ liệu một lần nữa trên tập tin đó, nó không thành công với các vấn đề liên quan đến cố gắng để thả một ràng buộc không tồn tại). Hơn nữa, tôi đã có thể xác nhận rằng di chuyển 'ban đầu' đã được chạy dựa trên cả hai mô hình dữ liệu trong DB, và từ sự hiện diện của một bản ghi trong bảng __MigrationHistory!

Nếu tôi xóa toàn bộ cơ sở dữ liệu và chạy tất cả các lần di chuyển một lần nữa, tự động hoặc bằng tay, tôi có cùng một vấn đề.

Các tập tin di cư 'gốc' Tôi đã thực hiện như sau:

public partial class RenameLinkColumns : DbMigration 
{ 
    public override void Up() 
    { 
     DropForeignKey("dbo.Listing", "OfferedByUserId", "dbo.User"); 
     DropIndex("dbo.Listing", new[] { "OfferedByUserId" }); 
     AddColumn("dbo.Listing", "ListedByUserId", c => c.Int(nullable: false)); 
     AddForeignKey("dbo.Listing", "ListedByUserId", "dbo.User", "UserId", cascadeDelete: true); 
     CreateIndex("dbo.Listing", "ListedByUserId"); 
     DropColumn("dbo.Listing", "OfferedByUserId"); 
    } 

    public override void Down() 
    { 
     AddColumn("dbo.Listing", "OfferedByUserId", c => c.Int(nullable: false)); 
     DropIndex("dbo.Listing", new[] { "ListedByUserId" }); 
     DropForeignKey("dbo.Listing", "ListedByUserId", "dbo.User"); 
     DropColumn("dbo.Listing", "ListedByUserId"); 
     CreateIndex("dbo.Listing", "OfferedByUserId"); 
     AddForeignKey("dbo.Listing", "OfferedByUserId", "dbo.User", "UserId", cascadeDelete: true); 
    } 
} 

Khi tôi chạy mà Add-Migration một lần nữa, Lên/Xuống phương pháp trong tập tin đó là chính xác giống như những.

Tôi khá ấn tượng rằng việc di chuyển đã có thể phát hiện chính xác rằng tôi đã đổi tên thành cột ForeignKey; nhưng đó là những gì đang gây ra điều này để choke?

Dường như có một công việc xung quanh: Tôi đã xóa cơ sở dữ liệu, và tất cả các tệp di chuyển và tạo một Di chuyển 'ban đầu' mới, nhưng tôi không muốn làm điều này nếu có thể.

Cập nhật: Đây là không sự di cư mới nhất mà gây ra vấn đề này, nhưng vấn đề bắt đầu sau một merge (Tôi đang làm việc một mình, nhưng tôi mô phỏng làm việc theo nhóm trên các chi nhánh để tìm hiểu thêm về git quá), và cố gắng để có được cơ sở dữ liệu trong bước với hợp nhất. Điều này có thể đến từ việc đặt di chuyển theo một số thứ tự cụ thể sau khi hợp nhất - mặc dù đã lưu ý, việc di chuyển đã làm hoạt động như mong đợi theo thứ tự chúng chạy khi tôi cung cấp cho họ một DB trống.

Ngoài ra, di chuyển ban đầu này cần tinh chỉnh thủ công khi bảng có dữ liệu, vì dữ liệu cần được sao chép từ cột cũ sang cột mới. Tuy nhiên, tôi đã thử nghiệm tệp đó có và không có chỉnh sửa thủ công của tôi trong tệp đó và vẫn gặp phải hành vi được ghi nhận.

Trả lời

22

This answer explains why it happens. Để giải quyết, tôi gọi số add-migration và đặt tên là MERGE rồi xóa mọi mã di chuyển trùng lặp đã xảy ra. Đây chỉ là cập nhật ảnh chụp nhanh mô hình để phản ánh mô hình đã hợp nhất.

Ví dụ:

public partial class MERGE : DbMigration 
{ 
    public override void Up() 
    { 
     // Intentionally left blank. 

     // This may seem like a hack, but it is necessary when using source control. 
     // When a migration is created via add-migration, EF creates 
     // an .edmx file from the current code first classes. It compares this .edmx to the .edmx stored in the last migration before this, 
     // which I'll call it's parent migration. The edmx snapshots are gzipped and stored in base64 in the resource files (.resx) if you 
     // want to see them. EF uses the difference between these two snapshots to determine what needs to be migrated. 

     // When using source control it will happen that two users add entities to the model independently. The generated edmx snapshots will 
     // only have the changes that they have made. When they merge in source control, they will end up with this: 

     // Migration      | Snapshot Contents 
     // -------------------------------- | ---------------- 
     // 20150101_Parent Migration  | A 
     // 20150102_Developer 1's Migration | A + Change 1 
     // 20150103_Developer 2's Migration | A + Change 2 

     // So calling add-migration will create the current snapshot edmx from the Code First model and compare it to the 
     // the latest migration's snapshot, which is A + Change 2, and see that Change 1 is missing. That is why it 
     // creates a duplicate migration. We know that the migrations have already been applied, so the only thing that this 
     // migration will do is update the current snapshot .edmx so that later migrations work fine. 
    } 

    public override void Down() 
    { 

    } 
} 

`` `

+0

Hi Mike Tôi không thể kiểm tra chéo trả lời của bạn là môi trường phát triển của tôi là dài biến mất, nhưng acceptng là câu trả lời như bạn đã cung cấp hấp dẫn lý luận (và một bình luận di chuyển tốt đẹp ở trên :) – Nij

+2

Cảm ơn bạn đã giải thích điều này. Tôi đã làm việc ra làm điều này như là một "sửa chữa" nhưng không vui khi kiểm tra nó mà không hiểu tại sao nó hoạt động. –

+2

công trình này nhưng nó là khủng khiếp, tôi không có gì để có một di chuyển không-làm gì mỗi khi tôi có một thay đổi silli –

3

Tôi cũng thấy điều này mọi lúc. Tôi không biết tại sao, ước gì tôi đã làm, nhưng giải pháp của tôi là thực hiện thêm di chuyển sẽ tạo một bản sao. Bây giờ bản sao này sẽ mở ra trong trình chỉnh sửa và sau đó tôi chỉnh sửa nó, để các phương thức Lên và Xuống trống. Vì vậy, kết quả là một tệp di chuyển không làm gì cả! VS rất vui và bạn có thể làm cơ sở dữ liệu cập nhật mà không có lỗi (cho đến lần sau).

Tôi hy vọng điều này sẽ giúp :)

0

Tôi vừa gặp phải vấn đề tương tự.

Sau khi di chuyển được tạo. Tôi đã cố gắng cập nhật cơ sở dữ liệu và nhận được thông báo sau:

Không thể cập nhật cơ sở dữ liệu cho phù hợp với mô hình hiện tại vì có thay đổi đang chờ xử lý và di chuyển tự động bị tắt.Hoặc ghi các thay đổi mô hình đang chờ xử lý vào quá trình di chuyển dựa trên mã hoặc bật tự động di chuyển. Đặt DbMigrationsConfiguration.AutomaticMigrationsEnabled thành true để bật di chuyển tự động. Bạn có thể sử dụng lệnh Add-Migration để viết các thay đổi mô hình đang chờ xử lý đối với việc di chuyển dựa trên mã.

Sau đó, tôi đã tạo lại di chuyển nhưng đã bị trùng lặp.

Sự cố được giải quyết khi tôi Tạo dự án sau khi tạo di chuyển. Sau đó, tập lệnh Update-Database tìm phương thức di chuyển và nó hoạt động. Ít nhất là cho trường hợp của tôi.

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