Làm cách nào để không di chuyển trong ASP.NET Core với EF Core


178

Khi tôi chạy PM> Remove-Migration -context BloggingContexttrong VS2015 với dự án ASP.NET Core sử dụng EF Core, tôi gặp lỗi sau:

System.InvalidOperationException: The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.    at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.RemoveMigration(String projectDir, String rootNamespace, Boolean force) 
    at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.RemoveMigration(String contextType, Boolean force) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsRemoveCommand.<>c__DisplayClass0_0.<Configure>b__0() 
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args) 
 The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.

Làm thế nào tôi có thể không hài lòng nó? Tôi đang sử dụng bản phát hành mới nhất của ASP.NET Core 1.0, EF Core và VS2015 Update 3.


3
thử thêm -forcevào cuối
tìm kiếm

1
Bài viết learnentityframeworkcore.com/migations#reversing-a-migration mô tả các bước. Cảm ơn @drewskis cho liên kết
Michael Freidgeim

Cảm ơn
@MichaelFreidgeim

Câu trả lời:


214

Sử dụng:

CLI

> dotnet ef database update <previous-migration-name>

Bảng điều khiển quản lý gói

PM> Update-Database <previous-migration-name>

Thí dụ:

PM> Update-Database MyInitialMigration

Sau đó cố gắng loại bỏ di chuyển cuối cùng.

Xóa di chuyển mà không cập nhật cơ sở dữ liệu không hoạt động vì bạn đã áp dụng các thay đổi cho cơ sở dữ liệu.

Nếu sử dụng PMC, hãy thử: PM> update-database 0 Thao tác này sẽ xóa cơ sở dữ liệu và cho phép bạn xóa Ảnh chụp di chuyển trên Giải pháp của bạn


6
Tôi vẫn nhận được cùng một lỗi. Lần đầu tiên tôi sử dụng dotnet ef database update MyFirstMigration --context BloggingContextđã làm việc thành công. Sau đó, tôi chạy dotnet ef migrations remove --context BloggingContextnó đã cho tôi thông báo lỗi giống như trong bài đăng của tôi
nam

14
Bạn sẽ cần cập nhật để di chuyển trước MyFirstMigration. Nếu đó là lần di chuyển đầu tiên (như tên ngụ ý) thì bạn có thể sử dụng dotnet ef database update 0để hoàn nguyên (không vui) tất cả các lần di chuyển từ cơ sở dữ liệu. Sau đó bạn sẽ có thể chạy dotnet ef migrations remove.
bvpb

Ngoài ra, điều đáng chú ý là bạn chỉ nên sử dụng tên của di chuyển, ngoại trừ tiền tố ngày
Được cấu trúc vào

2
Gọi dotnet ef migrations removesau này
Chamika Sandamal

Câu nói thứ hai của bạn: "Sau đó, cố gắng xóa di chuyển cuối cùng" không hoàn thành trong câu trả lời này, vui lòng nói chính xác ý của bạn. xóa tệp di chuyển? thực hiện một lệnh? ...
S.Serpooshan

125

Để loại bỏ hoàn toàn tất cả các di chuyển và bắt đầu lại, hãy làm như sau:

dotnet ef database update 0
dotnet ef migrations remove

1
Nhưng bạn không muốn xóa tất cả các di chuyển. Ví dụ: bạn muốn giữ di chuyển mặc định VS tạo cho danh tính (Tài khoản người dùng) trong thư mục Data \ Migration.
nam

Bạn nên biết dotnet ef database update 0, nhưng chạy dotnet ef migrations removesau đó sẽ xóa di chuyển mặc định cho Danh tính, điều có thể không mong muốn.
kimbaudi

Cảm ơn các mẹo trên dotnet ef database update 0! Tôi đã không thấy điều này được đề cập ở bất cứ đâu ...
Tobias J

3
@nam "Nhưng bạn không muốn xóa tất cả các lần di chuyển." Nhưng một số người trong chúng ta làm. Đừng giả sử những gì tôi muốn :)
starmandeluxe

3
Điều này đã không làm việc cho tôi. Dòng đầu tiên đã ổn và xóa tất cả các lần di chuyển, trên dòng thứ hai tôi vẫn nhận đượcThe migration '20180618103514_InitialMigration' has already been applied to the database. Revert it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.
Ido Ran

52

Bạn vẫn có thể sử dụng Update-Databaselệnh.

Update-Database -Migration <migration name> -Context <context name>

Tuy nhiên, đánh giá theo tên di chuyển của bạn, tôi cho rằng đó là lần di chuyển đầu tiên để lệnh đó có thể không hoạt động. Bạn sẽ có thể xóa mục từ __MigrationHistorybảng trong cơ sở dữ liệu của bạn và sau đó chạy lại Remove-Migrationlệnh. Bạn cũng có thể xóa tệp di chuyển và chỉ cần bắt đầu lại.


Bạn có thể gọi Update-Databasetừ Bảng điều khiển quản lý gói hoặc gọi dotnet ef database updatetừ dấu nhắc lệnh từ thư mục dự án.
kimbaudi

6
Chỉ cần làm rõ câu trả lời của Brad ở đây - <migration name>nên là tên của di chuyển mà bạn muốn quay lại (có thể là di chuyển trước khi bạn di chuyển lên), không phải là tên của di chuyển mà bạn muốn hoàn tác.
Đánh dấu Amery

51

Để không hài lòng một (các) di chuyển cụ thể :

dotnet ef database update LastGoodMigrationName
or
PM> Update-Database -Migration LastGoodMigrationName

Để không vui vẻ tất cả các di chuyển :

dotnet ef database update 0
or
PM> Update-Database -Migration 0

Để xóa di chuyển cuối cùng:

dotnet ef migrations remove
or
PM> Remove-Migration

Để xóa tất cả các di chuyển:

chỉ cần loại bỏ Migrationsthư mục.

Để xóa vài lần di chuyển gần đây (không phải tất cả):

Không có lệnh nào để xóa một loạt các lần di chuyển và chúng tôi không thể xóa một vài tệp này migrationsvà các *.designer.cstệp của chúng vì chúng tôi cần giữ tệp chụp nhanh ở trạng thái nhất quán. Chúng ta cần loại bỏ di chuyển từng cái một (xem To remove last migrationở trên).

Để không vui và xóa di chuyển cuối cùng:

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force

Tôi tiếp tục nhìn thấy các từ unapplytrên tất cả các bài viết. Nó chỉ đánh vào tôi không phải là một thuật ngữ kỹ thuật, đó là từun - apply
Helzgate

28

Để hoàn nguyên di chuyển được áp dụng cuối cùng, bạn nên (các lệnh của bảng điều khiển trình quản lý gói):

  1. Hoàn nguyên di chuyển từ cơ sở dữ liệu: PM> Update-Database <prior-migration-name>
  2. Xóa tệp di chuyển khỏi dự án (hoặc nó sẽ được áp dụng lại ở bước tiếp theo)
  3. Cập nhật ảnh chụp mô hình: PM> Remove-Migration

CẬP NHẬT : Bước thứ hai dường như không bắt buộc trong các phiên bản mới nhất của Visual Studio (2017).


1
Cảm ơn bạn! Điều này hoạt động hoàn hảo Hấp dẫn rằng trong số tất cả các giải pháp không ai từng đề cập đến sự cần thiết của bước 2.
Michael Kargl

Yeh, Không ai đề cập đến bước hai. Cảm ơn bạn
Ajas Aju

không chắc chắn về bước thứ hai, trong trường hợp của tôi (VS2017 mới nhất), tệp di chuyển sẽ tự động bị xóa sau khi gọi Remove-Migrationmà không gặp vấn đề gì. Tôi không chắc những gì bạn nói "nó sẽ được áp dụng lại ở bước tiếp theo"!
S.Serpooshan

@ S.Serpoo Sơn Thật vậy. Tôi đã xóa thủ công nhưng khi tôi chạy Remove-Migration, nó đã phàn nàn về việc di chuyển trước đây của tôi đã được áp dụng cho cơ sở dữ liệu. Nhưng nó đã có tác dụng.
MetalMikester 17/12/18

Bước thứ hai tôi nghĩ chỉ cần thiết nếu bạn gọi dbContext.Database.Migrate()trong startup của
mình.cs

23

Đơn giản là bạn có thể nhắm mục tiêu Di chuyển theo giá trị

 Update-Database -Migration:0

Sau đó tiếp tục và loại bỏ nó

 Remove-Migration

1
Điều này hiệu quả với tôi nhưng tôi đang sử dụng EF và .NET core 2.0 với VS2017
James Morrison

2
Xem ra: -Migration: 0 có nghĩa là quay trở lại trạng thái không di chuyển. Điều này sẽ xóa cơ sở dữ liệu của bạn
Kieren Johnstone

Có theo câu hỏi. Bạn có thể tăng giá trị tùy thuộc vào việc di chuyển mà bạn muốn quay lại
John Nyingi

11

Để "không vui" di chuyển nhiều nhất (gần đây?) Sau khi nó đã được áp dụng cho cơ sở dữ liệu:

  1. Mở SQL Server Object Explorer (Xem -> "SQL Server Object Explorer")
  2. Điều hướng đến cơ sở dữ liệu được liên kết với dự án của bạn bằng cách mở rộng các hình tam giác nhỏ sang một bên.
  3. Mở rộng "Bảng"
  4. Tìm bảng có tên "dbo._EFMigationsHistory".
  5. Nhấp chuột phải vào nó và chọn "Xem dữ liệu" để xem các mục trong bảng trong Visual Studio.
  6. Xóa hàng tương ứng với di chuyển của bạn mà bạn muốn không vui (Nói "có" với cảnh báo, nếu được nhắc).
  7. Chạy "di chuyển dotnet ef remove" một lần nữa trong cửa sổ lệnh trong thư mục có tệp project.json. Hoặc, chạy lệnh "Xóa-Di chuyển" trong bảng điều khiển trình quản lý gói.

Hy vọng điều này sẽ giúp và có thể áp dụng cho mọi di chuyển trong dự án ... Tôi chỉ thử nghiệm điều này với lần di chuyển gần đây nhất ...

Chúc mừng mã hóa!


21
Điều này sẽ không thực sự không áp dụng di chuyển, chỉ làm cho khung "nghĩ" nó chưa được áp dụng. Cơ sở dữ liệu của bạn sẽ ở trạng thái không nhất quán nếu bạn làm điều này.
mark.monteiro

Chỉnh sửa thủ công dữ liệu trong __EFMigationsHistory của bạn là lời khuyên khủng khiếp. Đừng làm điều đó. Bảng đó chỉ được sử dụng để sử dụng dưới các công cụ di chuyển. Nếu bạn bắt đầu chỉnh sửa dữ liệu theo cách thủ công, một lỗi duy nhất có thể tạo ra tất cả các loại hành vi bất ngờ điên rồ trong dự án của bạn. Đó là một ý tưởng tốt hơn nhiều để sử dụng một trong những giải pháp được đề xuất khác.
Joe Irby

Chúng tôi đã có một tình huống trong đó một thành viên nhóm thiếu niên đã nhầm lẫn với việc chuyển đổi chi nhánh và cuối cùng đã xóa di chuyển thủ công khỏi cả hai (mặc dù nó vẫn nằm trong bảng __EFMigationsHistory kể từ khi nó được áp dụng), vì vậy chúng tôi đã mất "xuống". Đây là những gì chúng tôi đã phải làm, cộng với một số đảo ngược thủ công trong SSMS. Vì vậy, đừng làm điều đó - trừ khi bạn không có lựa chọn nào khác vào thời điểm này. Ít nhất tất cả những gì anh ta đã làm là thêm một lĩnh vực mới.
Ella


10

Bạn nên xóa di cư '20160703192724_MyFirstMigration' kỷ lục từ '_EFMigrationsHistory' bảng.

nếu không lệnh này sẽ xóa di chuyển và xóa thư mục di chuyển:

   > remove-migration -force

7

Nói chung, nếu bạn đang sử dụng Bảng điều khiển Trình quản lý gói, cách đúng để xóa Di chuyển cụ thể là bằng cách tham chiếu tên của di chuyển

Update-Database -Migration {Name of Migration} -Context {context}

Một cách khác để loại bỏ di chuyển cuối cùng mà bạn đã áp dụng theo các tài liệu là sử dụng lệnh:

dotnet ef migrations remove

Lệnh này phải được thực thi từ dấu nhắc lệnh của nhà phát triển ( cách mở dấu nhắc lệnh ) trong thư mục giải pháp của bạn.

Ví dụ: nếu ứng dụng của bạn nằm trong tên "Ứng dụng" và nằm trong thư mục c: \ Project. Sau đó, con đường của bạn nên là:

C:\Projects\Application

1
Câu hỏi đặt ra là phải làm gì nếu di chuyển `dotnet ef remove 'trả về lỗi" Việc di chuyển đã được áp dụng cho cơ sở dữ liệu "
Michael Freidgeim 30/03/18

2

Để di chuyển không hoàn hảo trong EF Core 1.0, hãy sử dụng lệnh:

Cập nhật cơ sở dữ liệu ef của dotnet {Mig_name}

Sử dụng tên di chuyển của di chuyển cho đến khi bạn muốn duy trì các thay đổi của mình. Danh sách các tên của di chuyển có thể được tìm thấy bằng cách sử dụng:

danh sách di chuyển dotnet ef


2

Để hoàn nguyên tất cả các di chuyển được áp dụng cho DB, chỉ cần chạy:

update-database 0

Nó nên được theo sau với việc chạy Remove-Migrationnhiều lần như có các tệp di chuyển hiển thị trong thư mục Di chuyển. Lệnh xóa di chuyển mới nhất và cũng cập nhật ảnh chụp nhanh.


1

lúc đầu chạy lệnh sau:

PM>update-database -migration:0

và sau đó chạy cái này:

PM>remove_migration

Hoàn thành


0
var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
var roleManaget = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

await context.Database.EnsureDeletedAsync();

-1

1.tìm bảng "dbo._EFMigationsHistory", sau đó xóa bản ghi di chuyển mà bạn muốn xóa. 2. chạy "xóa di chuyển" trong PM (Bảng điều khiển quản lý gói). Làm việc cho tôi.


Điều này sẽ dẫn đến trạng thái không nhất quán của cơ sở dữ liệu (ví dụ: một cột đã bị hủy)
UNeverNo
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.