2013-04-10 29 views
9

Tôi đã sử dụng Entity Framework (5.0) trong một thời gian trong một dự án (ASP.NET MVC trong VS2012 Express). Ngay bây giờ, mặc dù, tôi không còn có thể thêm di chuyển.Khuôn khổ thực thể: Thêm di chuyển không thành công với Không thể cập nhật cơ sở dữ liệu

PM > Add-Migration -projectName MyProject.DAL TestMigration 
Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration. 

Tôi không biết nếu điều này mang đến cho bất kỳ đầu mối nhưng 'Không thể ..." text được hiển thị trong màu đỏ.

Tôi đã cố gắng để cho phép di chuyển tự động (mà làm cho không có ý nghĩa như tôi cố gắng để viết các thay đổi mô hình đang chờ xử lý để di trú dựa trên mã) và kết quả trong việc di chuyển yêu cầu trong cơ sở dữ liệu. Cơ sở dữ liệu được tạo lại (đến lần di chuyển trước đó) nhưng khi tôi cố gắng sử dụng Add-Migratio n Tôi vẫn gặp lỗi "Không thể cập nhật ..".

Sửa

Tôi đã thử các tham số -force nhưng không có sự khác biệt.

Nội dung của lớp cấu hình của tôi (tôi không thay đổi bất cứ điều gì sau khi di cư trước):

public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
    } 

    protected override void Seed(Bekosense.DAL.Context.BekosenseContext context) 
    {   
     context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageDrop); 
     context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageCreate); 
     context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageSentDrop); 
     context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageSentCreate); 
     context.Database.ExecuteSqlCommand(Properties.Resources.AddDbUsers); 
    } 

Sửa 2 tôi phát hiện ra rằng tôi có thể làm một add-di cư khi tôi nhận xét dòng sau trong DbContext của tôi:

//Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>()); 

khi tôi để dòng trên hoạt động và nhận xét mọi thứ trong tệp Cấu hình, nó vẫn không hoạt động. Tại sao dòng Database.SetInitializer lại gây ra hành vi lạ này?

+1

Bạn có thể xin vui lòng gửi tập tin cấu hình của bạn cho sự di cư? – IronMan84

+0

Bạn đã thử tham số-force? –

+0

tôi đã có cùng một vấn đề, câu trả lời của swapneel dưới đây làm việc cho tôi mặc dù nó là một chút cực đoan. may mắn thay tôi đang ở giai đoạn đầu vì vậy nó không phải là quá lớn một thỏa thuận –

Trả lời

4

bao giờ sử dụng automigrations, mà đã cho tôi những vấn đề trong quá khứ (khi di chuyển cơ sở dữ liệu xuống, sử dụng đúng cách để làm điều đó ngay từ đầu!)

Dòng này phải ở trong global.asax của bạn:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>()); 

Và không có trong DbContext của bạn!

lời khuyên khác nếu ở trên sẽ không giúp:

Có lẽ bạn có nhiều lớp trong ứng dụng của bạn:

Add-Migration 000 -StartupProjectName "NameOfTheProjectInSolutionExplorer" -ConfigurationTypeName "MyConfiguration" -ConnectionString "theconnectionstring;" -ConnectionProviderName "System.Data.SqlClient" -Verbose 

Trên đây là lệnh Add-Migration tôi sử dụng cho một ứng dụng đa lớp.

điều tương tự cho một bản cập nhật cơ sở dữ liệu

Update-Database -ConfigurationTypeName "SlaveConfiguration" -StartupProjectName "FacturatieMVCv2.Data" -Verbose -script 
22

Bạn có thể thiết lập lại khuôn khổ tổ chức để giải quyết vấn đề của bạn [Nhưng hãy nhớ nó sẽ mang lại cho di chuyển để trạng thái mặc định]

Lưu ý: Để thực hiện sao lưu trước khi thực hiện

bạn cần xóa trạng thái hiện tại:

  • Xóa thư mục di cư trong dự án của bạn
  • Xóa bảng __MigrationHistory trong cơ sở dữ liệu của bạn (có thể dưới bảng hệ thống)

Bạn sẽ tìm thấy bảng __MigrationHistory trong cơ sở dữ liệu của bạn [Dưới App_Data thư mục]

sau đó hãy chạy lệnh sau trong Package Manager Console:

Enable-Migrations -EnableAutomaticMigrations -Force 

Sử dụng có hoặc không có -EnableAutomaticMigrations

Và cuối cùng, bạn có thể chạy:

Add-Migration Initial 

This may also help you

+1

Bạn có thể tìm thấy câu trả lời này có liên quan hữu ích: http://stackoverflow.com/a/17798015/97964 Đôi khi bạn cần một di cư thứ hai hoặc bạn cần phải vô hiệu hóa mã được tạo trong quá trình di chuyển 'Initial'. Chìa khóa ở đây là lấy siêu dữ liệu DB của bạn theo thứ tự di chuyển ban đầu và sau đó đi từ đó. – jocull

+1

Đó là câu trả lời. – Erdogan

4

Trong trường hợp của tôi, tôi đã có những lỗi tương tự bởi vì tôi đã buộc ObjectContext.CommandTimeout trên lớp DbContext tại phương thức khởi tạo trong quá trình di chuyển.

Cố gắng loại bỏ nó

((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 5000; 
+0

Thật kỳ lạ, nhưng điều này cũng đang xảy ra với tôi. – bithavoc

+0

Bạn đã cứu ngày của tôi thưa ông – user449689

4

này đã làm việc cho tôi:

update-database -targetmigration:"0" -force -verbose 
add-migration Initial 
update-database 
+1

Tôi dường như quá mới đối với EF để hiểu giải pháp. đây là bài viết thứ 2 đề xuất sử dụng "Thêm di chuyển" nhưng ... tôi nhập loại này ở đâu? – Jonathan

+1

Bạn làm điều đó trong "Package Manager Console" trong Visual Studio. Xem danh sách các lệnh: https://coding.abel.nu/2012/03/ef-migrations-command-reference/ – Robert

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