Đặt lại di chuyển khung thực thể


299

Tôi đã làm hỏng các lần di chuyển của mình, tôi đã sử dụng IgnoreChangescho lần di chuyển ban đầu, nhưng bây giờ tôi muốn xóa tất cả các lần di chuyển của mình và bắt đầu với việc di chuyển ban đầu với tất cả logic.

Khi tôi xóa các di chuyển trong thư mục và thử và Add-Migrationnó không tạo ra một tệp đầy đủ (nó trống - vì tôi đã không thực hiện bất kỳ thay đổi nào kể từ lần di chuyển cuối cùng, nhưng hiện đã bị xóa).

Có bất kỳ lệnh Vô hiệu hóa di chuyển , vì vậy tôi có thể chạy lại Enable-Migrations?



3
Một lưu ý quan trọng nếu bạn có nhiều kết nối: chỉ định sử dụng kết nối nào khi bạn đặt lại di chuyển, nếu không, nó sẽ cố gắng áp dụng cho cả hai điều có thể gây ra sự cố khi có sự khác biệt.
Jeroen Vannevel

Lưu ý: Nếu bạn chưa xóa di chuyển của mình (bạn có sử dụng kiểm soát phiên bản không?), Bạn có thể đã cập nhật db của mình - để bạn di chuyển lần đầu tiên sau đó xóa giảm thiểu và tạo các di chuyển mới từ thời điểm đó. Xem tại đây: stackoverflow.com/a/23793384/309634
DarcyThomas

Câu trả lời:


446

Bạn cần phải :

  1. Xóa trạng thái: Xóa thư mục di chuyển trong dự án của bạn; Và
  2. Xóa __MigrationHistorybảng trong cơ sở dữ liệu của bạn (có thể dưới bảng hệ thống); Sau đó
  3. Chạy lệnh sau trong Bảng điều khiển quản lý gói:

    Enable-Migrations -EnableAutomaticMigrations -Force

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

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

    Add-Migration Initial

5
^^ Hình dung ra - đó là lỗi TFS - nếu bạn đang sử dụng TFS, bạn cần thực hiện đăng ký trước khi chạy lệnh "Kích hoạt di chuyển ...". : D
BrainSlugs83

7
Nếu bạn không sử dụng kiểm soát phiên bản, hãy lưu các giá trị Seed của bạn trước khi xóa!
RyanJMcGowan

77
@RyanJMcGowan nếu bạn không sử dụng kiểm soát phiên bản, bạn đáng bị mất việc. :-)
Mike Cole

4
@ Tốt. +1 vào đó. Tiết kiệm cho tôi rất nhiều thời gian. Bây giờ nếu chỉ có nhóm EF có thể kết hợp tất cả những điều đó vào lệnh Đặt lại di chuyển. Có lẽ là EF 6 ...
Gerald Davis

24
Đối với cơ sở dữ liệu hiện có, bạn cần nhận xét nội dung của chức năng "Lên". Nếu không, bạn sẽ gặp lỗi khi chạy "Cập nhật cơ sở dữ liệu", nó sẽ phàn nàn rằng bảng đã tồn tại
Guy

149

Vấn đề: Bạn đã làm hỏng việc di chuyển của mình và bạn muốn đặt lại nó mà không xóa các bảng hiện có.

Vấn đề: Bạn không thể đặt lại di chuyển với các bảng hiện có trong cơ sở dữ liệu vì EF muốn tạo các bảng từ đầu.

Phải làm gì:

  1. Xóa các di chuyển hiện có khỏi bảng Migations_History.

  2. Xóa các di chuyển hiện có khỏi Thư mục di chuyển.

  3. Chạy thiết lập lại bổ sung. Điều này sẽ tạo ra một di chuyển trong thư mục Di chuyển của bạn bao gồm việc tạo các bảng (nhưng nó sẽ không chạy nó để nó không bị lỗi.)

  4. Bây giờ bạn cần tạo hàng ban đầu trong bảng MigrationHistory để EF có ảnh chụp nhanh về trạng thái hiện tại. EF sẽ làm điều này nếu bạn áp dụng di chuyển. Tuy nhiên, bạn không thể áp dụng di chuyển mà bạn vừa thực hiện vì các bảng đã tồn tại trong cơ sở dữ liệu của bạn. Vì vậy, đi vào Di chuyển và nhận xét tất cả các mã bên trong phương thức "Lên".

  5. Bây giờ chạy cập nhật cơ sở dữ liệu. Nó sẽ áp dụng Di chuyển (trong khi không thực sự thay đổi cơ sở dữ liệu) và tạo một hàng chụp nhanh trong MigrationHistory.

Bây giờ bạn đã đặt lại di chuyển của mình và có thể tiếp tục di chuyển bình thường.


11
Đây là câu trả lời duy nhất làm việc cho tôi. Câu trả lời được chấp nhận dường như không giải quyết được vấn đề gì xảy ra khi bạn chạy Cập nhật cơ sở dữ liệu hoặc chạy ứng dụng của bạn (tùy thuộc vào loại trình khởi tạo nào bạn đang sử dụng). Nó sẽ cố gắng chạy di chuyển và cố gắng thực hiện các thay đổi đã tồn tại. Trừ khi tôi thiếu một cái gì đó.
Regarmike 20/07/14

2
Đó cũng là câu trả lời linh hoạt hơn. Trong trường hợp của tôi, có một số thay đổi mà tôi cần áp dụng và một số khác thì không. Tôi chỉ có thể giữ những thứ hữu ích trong Up () của mình.
tec-goblin

1
@ H.Johnson, tôi đã xem nó. Bạn có một câu hỏi về nó?
Greg Gum

2
Một điều cần lưu ý, từ EF 6.0, bảng _MigationsHistory chứa các lần di chuyển cho nhiều DBContexts. Xóa nó có thể gây ra vấn đề, bạn chỉ nên xóa các hàng trong đó ContextKey = tên di chuyển của bạn. Ngoài ra, sau 2 lần trên, tôi phải kích hoạt lại
David Waterworth

2
Về cơ bản là cùng một câu trả lời, với một ví dụ mở rộng (có ảnh chụp màn hình): weblog.west-wind.com/posts/2016/Jan/13/ ám
nmit026

30

Làm thế nào về

Update-Database TargetMigration: $InitialDatabase

trong Bảng điều khiển quản lý gói? Nó sẽ thiết lập lại tất cả các bản cập nhật về trạng thái rất sớm.

Liên kết tham chiếu: Di chuyển mã đầu tiên - Di chuyển sang một phiên bản cụ thể (bao gồm cả hạ cấp)


Tôi nghĩ rằng sự thất vọng chính của tôi đã không còn tin tưởng vào việc di chuyển để duy trì chính xác trạng thái. Và kết quả là muốn bắt đầu lại từ đầu.
Todd

@Todd, tôi đã vấp ngã và không phải lúc nào tôi cũng nên xóa các tệp di chuyển để bắt đầu lại. Bây giờ nó đang hoạt động như sau: 1. trở lại ban đầu bằng cách sử dụng lệnh "Cập nhật cơ sở dữ liệu từ xaTargetMigration: $ InitialDatabase". 2. Xóa tất cả các tệp di chuyển (được đặt tên bằng yyyyMMddHHmmssx_Name.cs hoặc .vb) 3. Làm mới bản cập nhật bằng cách sử dụng 'add-Migration -Name some_name'. 4. Phát hành bản cập nhật để ảnh hưởng đến cơ sở dữ liệu của bạn bằng cách sử dụng 'Cập nhật cơ sở dữ liệu'. Hi vọng nó sẽ giúp ích cho bạn.
Chris Voon

Trong trường hợp của tôi, lệnh được đề xuất trong câu trả lời này dẫn đến lỗi SQL.
Justin Skiles

"Cơ sở dữ liệu ban đầu" nghĩa là gì? nó sẽ xóa các bảng hoặc cột đã được tạo trong DB?
Serge

16

Để khắc phục điều này, bạn cần phải:

  1. Xóa tất cả các tệp * .cs trong Thư mục di chuyển.

  2. Xóa Bảng _MigrationHistory trong Cơ sở dữ liệu

  3. Chạy Enable-Migrations -EnableAutomaticMigrations -Force

  4. Chạy Add-Migration Reset

Sau đó, trong public partial class Reset : DbMigrationlớp, bạn cần nhận xét tất cả các Bảng hiện có và hiện tại:

public override void Up()
{
// CreateTable(
// "dbo.<EXISTING TABLE NAME IN DATABASE>
// ...
// }
...
}

Nếu bạn bỏ lỡ bit này, tất cả sẽ thất bại và bạn phải bắt đầu lại!

  1. Bây giờ chạy Update-Database -verbose

Điều này sẽ thành công nếu bạn đã thực hiện đúng như trên và bây giờ bạn có thể tiếp tục như bình thường.


2
Thay vì bình luận mọi thứ, bạn cũng có thể viết "return;" trong dòng đầu tiên của phương thức Up ().
chainstair

6

Xem xét điều này vẫn hiển thị khi chúng tôi tìm kiếm EF trong .NET Core, tôi sẽ đăng câu trả lời của mình ở đây (Vì nó đã ám ảnh tôi rất nhiều). Lưu ý rằng có một số điểm tinh tế với phiên bản .NET 6 .NET (Không có lệnh ban đầu và bạn sẽ cần xóa các tệp "Ảnh chụp nhanh")

(Đã thử nghiệm trong .NET Core 2.1)

Dưới đây là các bước:

  1. Xóa _efmigrationhistorybảng.
  2. Tìm kiếm toàn bộ giải pháp của bạn cho các tệp chứa Ảnh chụp nhanh trong tên của họ, chẳng hạn như ApplicationDbContextSnapshot.csxóa chúng.
  3. Xây dựng lại giải pháp của bạn
  4. Chạy Add-Migration InitialMigration

Xin lưu ý: Bạn phải xóa TẤT CẢ các tệp Ảnh chụp . Tôi đã dành vô số giờ chỉ để xóa cơ sở dữ liệu ... Điều này sẽ tạo ra một di chuyển trống nếu bạn không làm điều đó.

Ngoài ra, trong # 3, bạn chỉ có thể đặt tên cho di chuyển của mình theo cách bạn muốn.

Dưới đây là một số tài nguyên bổ sung: Di chuyển CORE CORE được tạo trống

Đặt lại di chuyển Khung thực thể 7


3

Trong EntityFramework 6, vui lòng thử:

Add-Migration Initial

để cập nhật tập tin di chuyển ban đầu.


3

Trong lõi khung thực thể.

  1. Xóa tất cả các tệp khỏi thư mục di chuyển.
  2. Nhập vào bảng điều khiển

cơ sở dữ liệu dotf ef thả -f -v

di chuyển dotnet ef thêm ban đầu

Cập nhật cơ sở dữ liệu ef dotnet


2

Vấn đề của tôi hóa ra là tôi đã xóa thủ công thư mục Di chuyển. Tôi đã làm điều đó bởi vì tôi muốn sao lưu nội dung, vì vậy tôi chỉ cần kéo thư mục ra khỏi dự án. Sau đó tôi đã khắc phục sự cố bằng cách đưa nó trở lại (sau khi tạo bản sao lưu), sau đó xóa thư mục Di chuyển bằng cách nhấp chuột phải vào Giải pháp Explorer và chọn Xóa từ menu bật lên.


1

Trong EF6

  1. Xóa tất cả các tệp của bạn trong thư mục 'di chuyển' ... Nhưng không phải là 'tạo ban đầu' hoặc 'cấu hình'.
  2. Xóa cơ sở dữ liệu.
  3. Bây giờ chạy Add-Migration Initial.
  4. Bây giờ bạn có thể 'cập nhật cơ sở dữ liệu' và tất cả sẽ ổn.

1

Xóa các Migrationsthư mục, Cleansau đó Rebuilddự án. Điều này làm việc cho tôi. Trước khi Clean and Rebuild, người ta nói rằng Migration đã tồn tại vì trong bộ nhớ đệm của nó, nó vẫn chưa bị xóa.


0

Phương pháp này không yêu cầu xóa __MigrationHistorybảng, vì vậy bạn không cần phải đặt tay vào cơ sở dữ liệu khi triển khai.

  1. Xóa các di chuyển hiện có từ thư mục Di chuyển.
  2. Trong Gói quản lý gói chạy Add-Migration ResetMigrations
  3. Làm sạch lịch sử di chuyển trong Up()phương thức:
/// <summary>
/// Reset existing migrations by cleaning the __MigrationHistory table
/// and creating a new initial migration with the current model snapshot.
/// </summary>
public partial class ResetMigrations : DbMigration
{
    public override void Up()
    {
        Sql("DELETE FROM [dbo].[__MigrationHistory]");
    }

    public override void Down()
    {
    }
}

0

Trong Net Core 3.0:

Tôi không thể tìm cách thiết lập lại di chuyển .

Tôi cũng gặp vấn đề với việc di chuyển bị hỏng và câu trả lời được cung cấp ở đây không hiệu quả với tôi. Tôi có API web .Net Core 3.0 và ở đâu đó trong tháng trước tôi đã chỉnh sửa cơ sở dữ liệu trực tiếp. Vâng, tôi đã làm một điều xấu, xấu.

Các chiến lược được đề xuất ở đây dẫn đến một số lỗi trong Bảng điều khiển quản lý gói:

  • Di chuyển tên đó đã tồn tại
  • Không thể tìm thấy ảnh chụp nhanh
  • 'Lực lượng' không phải là thông số được công nhận

Cấp, tôi có thể đã bỏ lỡ một bước hoặc bỏ qua việc xóa các tệp chính xác, nhưng tôi thấy rằng có nhiều cách để làm sạch điều này mà không cần nhiều sức mạnh vũ phu:

  • Di chuyển-Di chuyển khỏi PMC cho mỗi lần di chuyển theo tên, theo thứ tự ngược lại, tối đa và bao gồm di chuyển bị hỏng
  • Thêm di chuyển để tạo một di chuyển mới sẽ là đồng bằng giữa lần di chuyển tốt cuối cùng cho đến lược đồ hiện tại

Bây giờ khi API web được bắt đầu với cơ sở dữ liệu trống, nó sẽ tạo chính xác tất cả các bảng và thuộc tính để khớp với các mô hình thực thể.

HTH!


0

CẬP NHẬT 2020

Add-Migration Initial -Context ApplicationDbContext

ApplicationDbContext => Bối cảnh của bạn.


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.