Không thể tạo di chuyển rõ ràng trong khung thực thể


96

Tôi đang thêm một di chuyển mới nhưng thông báo này hiển thị:

Không thể tạo di chuyển rõ ràng vì các di chuyển rõ ràng sau đang chờ xử lý: [201203170856167_left]. Áp dụng các di chuyển rõ ràng đang chờ xử lý trước khi cố gắng tạo một di chuyển rõ ràng mới.

Ai giúp tôi với?


11
Điều này xảy ra với tôi khi tôi vô tình chuyển dự án khởi nghiệp của mình sang một dự án khác. Bạn (hoặc những người khác đang đọc bài viết này) có thể muốn nhanh chóng kiểm tra điều đó trước khi thử chụp một số vấn đề chuyên sâu hơn (đặc biệt là những thứ mà bạn phải bắt đầu xóa di chuyển, v.v.).
NicholasFolk

Có một lớp di chuyển trong thư mục Migrations không được cập nhật trong _MigrationHistory của cơ sở dữ liệu. Xóa lớp đó để có cùng trạng thái cả trong thư mục Di chuyển và cơ sở dữ liệu đã giải quyết được vấn đề của tôi.
Aryan Firouzian

1
Điều này xảy ra với tôi một cách ngẫu nhiên. Khi nó xảy ra, nó cho thấy rằng tất cả các di chuyển của tôi cần được áp dụng. Tôi phải khởi động lại Visual Studio để nó hoạt động vì tôi đã thiết lập mọi thứ đúng cách.
Larry Flewwelling

Câu trả lời:


81

Nó cho bạn biết rằng có một số quá trình di chuyển chưa được xử lý trong ứng dụng của bạn và nó yêu cầu chạy Update-Databasetrước khi bạn có thể thêm một lần di chuyển khác.


12
Tôi muốn tạo lại quá trình di chuyển ban đầu? Điều này ngăn bạn làm như vậy?
Rebecca

Không làm việc cho tôi, Cập nhật-Cơ sở dữ liệu chỉ cho tôi một lỗi khác. Trước tiên tôi phải xóa các tệp đang chờ xử lý.
Vahx

1
Câu trả lời của Thomas là câu trả lời hữu ích cho trường hợp tương tự của tôi.
Tarek Shawadfy

2
Nó có thể là cần thiết để tuyên bố một khởi động dự án-StartupProject ContentHub.Database
osanger

2
Update-Database
give

53

Tôi đã từng gặp vấn đề tương tự. Rõ ràng khung thực thể tạo ra lỗi này khi nó không thể kết nối với cơ sở dữ liệu. Vì vậy, hãy đảm bảo rằng bạn có thể truy cập nó trước khi tìm kiếm các vấn đề khác.


1
Tôi cũng sẽ nói thêm rằng đây sẽ là trường hợp khi bạn chuyển App.config của mình sang một dự án khác hoặc nếu nó chỉ bị thiếu trong dự án của bạn hoặc nếu nó nằm trong dự án của bạn nhưng được định cấu hình không chính xác.
Mã Maverick

Tôi cũng gặp lỗi này sau khi IP của tôi thay đổi (xảy ra cả sau khi chuyển đổi vị trí và sau khi thay đổi dyn dns). Điều này khiến tường lửa trong Cơ sở dữ liệu Azure mà chúng tôi đang sử dụng thu hồi thông tin đăng nhập. Di chuyển EF không hữu ích tạo ra lỗi ở trên thay vì "không thể đăng nhập" ...
Victor

8
Một điểm khác tôi muốn thực hiện là đảm bảo kiểm tra dự án khởi động của bạn có phải là dự án có chuỗi kết nối ngữ cảnh db của bạn không. Tôi gặp sự cố này khi tạm thời thay đổi dự án khởi động của mình và không nhận ra rằng dự án khác không có cùng chuỗi kết nối.
Gage Trader

Thêm vào @GageTrader: Tôi có nhiều dự án khởi động, một dự án không có cấu hình và dự án web có EF-config. dự án (Kho lưu trữ) có di chuyển có cùng cấu hình EF trong app.config của nó như dự án web. nhưng ngay cả khi tôi chọn dự án kho lưu trữ làm dự án khởi động thì nó không hoạt động, nhưng khi tôi đặt dự án web để khởi động thì nó đã hoạt động.
JimiSweden 22/09/17

Tôi phải nói rõ các tham số -ConnectionString, mà đã làm các trick cho tôi
Brian Colavito

34

Bạn cần chạy "update-database" từ bảng điều khiển trình quản lý gói để đẩy các thay đổi của bạn vào cơ sở dữ liệu HOẶC bạn có thể xóa tệp di chuyển đang chờ xử lý ([201203170856167_left]) khỏi thư mục Migrations rồi chạy lại "add -igration" để tạo một quá trình di chuyển hoàn toàn mới dựa trên các chỉnh sửa của bạn.


1
Tôi đã xóa tệp di chuyển và chạy bổ sung di chuyển, nhưng nó vẫn cho lỗi tương tự.
nu everest

2
Cảm ơn, mẹo về việc xóa tệp di chuyển đang chờ xử lý là một cứu cánh
Manish

31

Lỗi này cũng có thể có nghĩa là quá trình di chuyển không được nhận dạng nữa. Điều này đã xảy ra với tôi sau khi đã thay đổi giá trị của ContextKey trong Migrations.Configuration. Giải pháp đơn giản là cập nhật ContextKey trong bảng cơ sở dữ liệu "__MigrationHistory" (hoặc hoàn nguyên giá trị trong lớp Cấu hình mà tôi đoán). ContextKey và Namespace trong ứng dụng của bạn phải khớp nhau.


1
Đó là câu trả lời đúng cho trường hợp của tôi. Vì tôi đã sử dụng một trong các dự án cũ của mình cho một dự án tương tự mới, nên tôi không thể thực hiện các thay đổi đối với DB so với các lần di chuyển cũ. Như Thomas đã đề xuất, không gian tên trong Migrations khác với Contextkey trong bảng _MigrationsHistory, điều này khiến các di chuyển cũ không được nhận dạng.
Tarek Shawadfy

1
Điều này đã giúp tôi vì tôi đã gây ra sự cố bằng cách đổi tên giải pháp. Trong quá trình này, tôi đã đổi tên ContextKey để nó không còn khớp với các mục _MigrationHistory.
Joel

Cũng làm việc cho tôi, đặt một khóa ngữ cảnh rõ ràng trong cấu hình, thay đổi nó trong __MigrationHistory và cập nhật-cơ sở dữ liệu quyết định mọi thứ đều ổn. Cảm ơn!
James White

2
Vô lý, nhưng nó đúng. Nếu bạn đã cập nhật tên dự án hoặc nếu bạn chia dự án của mình (trường hợp của tôi) thành ít và bạn đang cố gắng thêm di chuyển mới từ một dự án mới vào cùng một db, bạn phải sử dụng ContextKey chính xác, bạn có thể đặt nó trong phương thức khởi tạo Cấu hình ( bạn phải sử dụng khóa Ngữ cảnh mà bạn có trong bảng __MigrationHistory trong target DB)
BotanMan 10/09/17

tương tự ở đây, tôi đã đổi tên không gian tên mặc định của mình và thay thế nó trong suốt giải pháp của tôi, điều này gây ra sự cố
WtFudgE

18

1. Chuỗi kết nối / Quyền kết nối

Kiểm tra lại chuỗi kết nối.

Đảm bảo rằng người dùng mà bạn đang kết nối vẫn có quyền đọc [__MigrationHistory]và có quyền chỉnh sửa lược đồ.

Bạn cũng có thể thử thay đổi chuỗi kết nối trong tệp cấu hình Ứng dụng hoặc Web để sử dụng Bảo mật tích hợp (Windows Auth) để chạy lệnh bổ sung di chuyển như chính bạn .

Ví dụ:

connectionString="data source=server;initial catalog=db;persist security info=True;Integrated Security=SSPI;" 

Chuỗi kết nối này sẽ đi trong tệp App.config của dự án nơi chứa DbContext.

2. Dự án StartUp

Bạn có thể chỉ định dự án StartUp trên dòng lệnh hoặc bạn có thể nhấp chuột phải vào dự án với thư mục DbContext, Configurationvà Migrations và chọn Đặt làm dự án StartUp . Tôi nghiêm túc, điều này thực sự có thể giúp ích.

nhập mô tả hình ảnh ở đây


Haha. Tôi ước điều này sẽ nhận được nhiều phiếu bầu hơn. Điều này xảy ra với tôi rất nhiều và bản Integrated Securitysửa lỗi hoạt động tuyệt vời!
Jess

1
Tôi đã gặp vấn đề tương tự, không có lệnh di chuyển nào hoạt động. Hóa ra không thiết lập dự án khởi động là thủ phạm. Thiết lập đó đã khắc phục sự cố của tôi.
Vishal

Thay đổi dự án khởi nghiệp đã làm việc cho tôi! Tôi chắc chắn rằng nó sẽ không hoạt động nhưng tôi đã thử nó dù sao vì mọi thứ khác đều thất bại. Câu trả lời chính xác.
Sylvain Rodrigue

"Đặt làm Khởi động" - không bao giờ có thể đoán được! Cảm ơn bạn!!
Jasel

1
Đúng, tôi đã cố ý thay đổi dự án khởi động và quên thay đổi lại. Và buồn cười là, một lần di chuyển trước đó đã được thực hiện với dự án khởi động thích hợp, vì vậy mọi thứ đều hoạt động tốt. Nhưng điều này là hợp lý bây giờ - b / c EF lấy chuỗi kết nối từ dự án, do đó nó "không biết" rằng quá trình di chuyển thực sự đã được áp dụng cho DB ...
kosist

8

Gặp vấn đề tương tự và có thể giải quyết bằng một số gợi ý từ các câu trả lời ở trên:

  • Trong bảng điều khiển trình quản lý gói, hãy kiểm tra dự án mặc định (trỏ đến dự án với cấu hình di chuyển
  • Đảm bảo rằng startup-proj có web.config với kết nối hợp lệ (hoặc
  • Đảm bảo rằng dự án di chuyển có app.config / web.config với kết nối hợp lệ
  • Kiểm tra quyền trong DB (cho người dùng được định cấu hình trong kết nối của bạn)

Sử dụng "update-database -verbose" trong bảng điều khiển trình quản lý gói để nhận thêm thông tin cụ thể về nơi di chuyển cố gắng kết nối. (Đã giúp trong trường hợp của tôi để tìm ra proj khởi động của tôi không được đặt chính xác ...)


2
đã chạy "update-database -verbose" và nhận thấy rằng chuỗi kết nối của tôi đã bị hỏng, lol. Vì vậy, lệnh bổ sung di chuyển đưa ra thông báo sai.
Wachburn

4
"Đảm bảo startup-proj {...}" đã giải quyết được vấn đề của tôi. Cảm ơn @flex
Andy Schmitt


7

Khi gặp sự cố này, hãy thử thêm các tham số vào lệnh ghép ngắn bổ sung của bạn. Ví dụ, việc chỉ định dự án khởi động cũng như tên chuỗi kết nối có thể giúp EF tìm thấy cơ sở dữ liệu mục tiêu của bạn.

add-migration Delta_Defect_0973 -ConfigurationTypeName your.namespace.ContextClassName -StartUpProject DeltaProject -ConnectionStringName DeltaSQL

Ở đâu:

Delta_Defect_0973 là tên di chuyển của bạn

your.namespace.ContextClassName là tên của lớp Cấu hình trong thư mục di chuyển của bạn, có tiền tố là không gian tên đầy đủ.

DeltaProject là tên của dự án chính với tệp web.config hoặc app.config của bạn.

DeltaSQL là tên của chuỗi kết nối được xác định trong tệp web.config hoặc app.config của bạn.


Cảm ơn. Điều này thực sự đã giúp tôi.
Jess

Ngoài ra, nếu bạn đang sử dụng chèn phụ thuộc trong giải pháp của mình, bạn có thể phải chọn một Dự án mặc định khác trong Bảng điều khiển Trình quản lý Gói. Nếu EF không thể xác định các di chuyển của bạn, hãy thử chọn dự án thực sự chứa di chuyển làm dự án mặc định.
Yves Rochon

5

Lỗi này có nghĩa là có những quá trình di chuyển đang chờ xử lý cần được cam kết trước khi bạn có thể thực hiện một quá trình di chuyển rõ ràng khác. Bạn có thể chọn

  1. Thực thi các di chuyển đang chờ xử lý đó bằng lệnh Update-Database
  2. Xóa những di chuyển đang chờ xử lý. Cách an toàn nhất là mở thư mục Migrations, nhấp chuột phải vào [201203170856167_left]> Loại trừ khỏi dự án

Sau phần này, bạn có thể bắt đầu lại "Add-Migration ..."

Hy vọng nó giúp


4

Chỉ hai xu của tôi:

Kịch bản của tôi:

  1. Tôi đã khôi phục cơ sở dữ liệu cục bộ của mình về trạng thái hoạt động.
  2. Đã có những di chuyển đã được áp dụng cho nó.
  3. Bất cứ khi nào tôi thử thêm một di chuyển mới, tôi đều gặp lỗi về các di chuyển đang chờ xử lý như đã đề cập đến OP của tôi.

Giải pháp:

Để giải quyết vấn đề này, tôi chỉ cung cấp các thông số rõ ràng hơn:

Add-Migration -ConnectionString "Server=localhost\SQLEXPRESS;Database=YourDataBase;Trusted_Connection=True;" -ConnectionProviderName "System.Data.SqlClient" -verbose

Tôi tin rằng bạn có thể đặt một cài đặt trong thư mục app.config của mình để cho phép bạn mặc định hành vi này để bạn không phải cung cấp các thông số rõ ràng mọi lúc. Tuy nhiên tôi không chắc chắn về cách làm điều này.


1
Điều này đã làm việc cho tôi, tôi chỉ cần thêm tên của quá trình di chuyển vào cuối lệnh được hiển thị ở trên.
sfors nói Khôi phục Monica

1
=) - rất vui vì tôi có thể giúp đỡ.
IbrarMumtaz

1
-ConnectionStringNamelà một giải pháp thay thế cho điều này và sẽ kéo chuỗi kết nối từ cấu hình của bạn theo tên
Simon_Weaver

1
Điều này đã giúp cho tôi bởi vì tôi không lưu trữ các chuỗi kết nối trong file config
Sasinosoft

3

Có một sự mơ hồ và lỗi như vậy. Cách tốt nhất là loại trừ tệp di chuyển hiện tại và tạo tệp di chuyển mới ( thêm-di chuyển ), sau đó sao chép nội dung của quá trình di chuyển mới vào tệp bị loại trừ và bao gồm lại và chạy lệnh update-database .


Tôi chỉ chạy update-databaselệnh sau đó thử lại add-migrationlệnh của mình và nó hoạt động
Smitty-Werben-Jager-Manjenson

3

tôi đã giải quyết vấn đề tương tự như thế này:

  • xóa tệp di chuyển cũ
  • update-database -force
  • Add-Migration addedEntity
  • cập nhật cơ sở dữ liệu

1

Tôi đã gặp vấn đề tương tự và chỉ có thể giải quyết nó bằng cách chạy Add-Migration 'MigrationName' -Force

Với -Force là phần quan trọng.


1

Cơ sở dữ liệu cục bộ của tôi không có __MigrationHistorydân cư hoặc hiện có. Tôi đã tạo bảng theo cách thủ công, sau đó di chuyển dữ liệu trong bảng đó từ PROD sang cơ sở dữ liệu cục bộ của tôi. Điều này khiến VS nghĩ rằng việc di chuyển đã được áp dụng (mà họ đã từng).


tôi đã gặp vấn đề tương tự, tôi đã hợp nhất DB trực tiếp của mình vào sản xuất nhưng do đó lịch sử di chuyển bị mất.
matthy

1

Mẹo: Bạn nên sử dụng -Scriptnút chuyển cho các lệnh di chuyển nếu bạn không chắc chắn. Nó cũng thực sự giúp hiểu những gìUpdate-Database thực sự làm.

Tôi chạy phần sau để cập nhật cơ sở dữ liệu, sau đó tôi nhận được một tập lệnh mà tôi có thể áp dụng theo cách thủ công (hoặc chỉ chạy lại mà không có thẻ -Script).

Update-Databasetôi sẽ chạy như sau:

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

Trong trường hợp SQL_AzureLivelà chuỗi kết nối có tên trong cấu hình của tôi.

Sau đó, tôi có thể xác minh SQL trông đúng, áp dụng nó và được thực hiện. Như nhiều người khác đã nói nếu chuỗi kết nối sai hoặc không hợp lệ, bạn sẽ gặp lỗi này.


1

Đối với tôi, tôi đã xóa tệp di chuyển (trong trường hợp của bạn là "201203170856167_left") khỏi Migrationsthư mục, sau đó chạy lệnh dưới đây trong bảng điều khiển Trình quản lý gói

Add-Migration <Parameter>
Update-Database

0

Tình huống

  • Tôi đang làm việc trong một chi nhánh mà tôi đã tạo một di chuyển DB mới.
  • Tôi đã sẵn sàng cập nhật từ master, nhưng master cũng có một lần di chuyển DB gần đây.
  • Tôi xóa di chuyển db của chi nhánh của mình để tránh xung đột.
  • Tôi "cập nhật từ chủ".

Vấn đề

Sau khi cập nhật từ trang cái, tôi chạy "Add-Migration my_migration_name", nhưng gặp lỗi sau:

Không thể tạo quá trình di chuyển rõ ràng vì các lần di chuyển rõ ràng sau đang chờ xử lý: [201607181944091_AddExternalEmailActivity]. Áp dụng các di chuyển rõ ràng đang chờ xử lý trước khi cố gắng tạo một di chuyển rõ ràng mới.

Vì vậy, tôi chạy "Cập nhật-Cơ sở dữ liệu" và gặp lỗi sau:

Không thể cập nhật cơ sở dữ liệu để phù hợp với mô hình hiện tại vì có những thay đổi đang chờ xử lý và tính năng di chuyển tự động bị tắt

Giải pháp

Tại thời điểm này, việc chạy lại "Add-Migration my_migration_name" đã giải quyết được vấn đề của tôi. Lý thuyết của tôi là chạy "Update-Database" có mọi thứ ở trạng thái cần thiết để "Add-Migration" hoạt động.


0

Tôi cũng đã xem qua vấn đề này. Nó xảy ra khi tôi tạo DB mới và tôi có những thay đổi đang chờ xử lý cho lần di chuyển DB đầu tiên mã của mình, sau đó tôi cố gắng chạy lệnh "Update-Database". Giải pháp: Chạy lệnh "Add-Migration -MigrationName" để tạo quá trình di chuyển mới cho DB mới. Sau đó chạy lệnh "Update-Database".


0

Tôi cũng gặp sự cố này đối với cơ sở dữ liệu mà tôi biết là đã cập nhật khi chạy Add-Migration. Giải quyết bằng cách đơn giản chạy lệnh Add-Migration lần thứ hai. Nghi ngờ sự cố kết nối, như được đề xuất bởi Robin Dorbell ở trên.


Trong trường hợp của tôi, tên cơ sở dữ liệu có thể phân biệt chữ hoa chữ thường khi chạy lệnh. càng sớm càng làm connectionstring chính xác giống như những gì đã ở db, nó làm việc tốt
PbO

0

Điều đó đã xảy ra khi tôi đột ngột đổi tên lớp di chuyển cũ đã tồn tại trong db. Tôi đã kiểm tra lịch sử VCS, xác định điều đó và đổi tên lại. Tất cả đều hoạt động sau đó.


0

Tôi đã làm một cách khác. Tôi đã loại bỏ hoàn toàn cơ sở dữ liệu và chạy lại "update-database" trong vs.


Điều này không cung cấp một bản sửa lỗi khả thi; di chuyển hợp lệ vẫn giữ cấu trúc hiện có.
Ferdipux

0

Tôi đã có một vấn đề đơn giản hơn. VS đã báo cáo sai lỗi này khi tôi có kết nối VPN đến trang web của khách hàng được kết nối trên máy trạm của tôi. Vấn đề là bảo mật DBMS được đặt để chỉ chấp nhận các yêu cầu từ IP cục bộ thực của tôi. Chỉ cần tắt VPN đã giải quyết được sự cố.


0

Trong trường hợp của tôi, tôi đã quên thêm địa chỉ IP của mình trong các quy tắc tường lửa trong Azure, về cơ bản vì tôi không thể kết nối với cơ sở dữ liệu mà tôi gặp phải lỗi này. Vì vậy, cụ thể cho trường hợp của tôi, tôi đã thêm địa chỉ IP của mình vào các quy tắc tường lửa cơ sở dữ liệu trong Azure và tất cả đều hoạt động tốt. Ngoài ra, nó có thể là vấn đề về proxy / kết nối internet / mật khẩu tên người dùng DB / chuỗi kết nối DB, v.v. HOẶC rõ ràng, bạn có thể có các di chuyển đang chờ xử lý mà bạn cần chạy lệnh Update-Database.


0

Trước đây, tôi luôn giải quyết vấn đề này bằng cách xóa các lần di chuyển đang chờ xử lý hoặc nếu chỉ còn lại 1 lần và phần lớn là mong muốn, bằng cách sử dụng -f để tạo lại nó.

Gần đây, điều này đã ngừng hoạt động đối với tôi.

Khi điều này xảy ra lần đầu tiên, tôi khởi động lại Visual Studio và sau đó nó cho phép tôi tiếp tục.

Lần thứ hai, nó chỉ hoạt động sau khi tôi chạy Clean on the project. Dường như các di chuyển đang chờ xử lý vẫn được giữ lại mặc dù đã xóa tất cả các tệp khỏi explorer.


0

Đây sẽ không phải là câu trả lời cho nhiều người, nhưng EF sẽ giải quyết lỗi này khi nó không thể kết nối với DB. Nếu bạn đang làm việc tại nhà như tôi, hãy đảm bảo rằng bạn vẫn kết nối với VPN của mình!


-1

Tôi cũng gặp phải vấn đề tương tự ngay sau khi hoàn nguyên từ một quá trình di chuyển sang một quá trình khác.

Trong trường hợp của tôi, tôi đã "chuyển đổi mục tiêu" từ "chuyển đổi mục tiêu" sang "di cư04".

Tôi cần xóa "igration0 "6 và sau đó tôi có thể buộc tạo "igration05". Về cơ bản, điều này có nghĩa là bạn chỉ cần giữ lần di chuyển tiếp theo sau lần di chuyển được nhắm mục tiêu.


-1

Trong trường hợp của tôi (sử dụng MS Visual Studio), nó đơn giản như khởi động lại Visual Studio.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.