2015-02-02 13 views
8

Tôi đang cố gắng sử dụng Code First with Migrations. Mặc dù không có thay đổi hiện tại cho mô hình của tôi, tôi nhận được một ngoại lệ. Khi tôi thêm một di dân, lên và xuống là trống rỗng, nhưng tôi nhận được một lỗi runtime với thông điệp như sau:Mô hình sao lưu ngữ cảnh 'DataContext' đã thay đổi kể từ khi cơ sở dữ liệu được tạo ra

Một ngoại lệ của loại 'System.InvalidOperationException' xảy ra ở EntityFramework.dll nhưng đã không được xử lý trong mã người dùng

Thông tin bổ sung: Mô hình sao lưu ngữ cảnh 'MyDataContext' đã thay đổi kể từ khi cơ sở dữ liệu được tạo. Xem xét sử dụng Mã Đầu tiên Migrations để cập nhật cơ sở dữ liệu (http://go.microsoft.com/fwlink/

kiến ​​trúc của tôi là như sau:

  • dự án DataAccess bao gồm bối cảnh, cấu hình chất lỏng và sự di cư của mã dự án mẫu
  • có chứa các lớp poco
  • dự án API Web và MVC có chứa chuỗi kết nối trong tệp web.config tương ứng của chúng.

Ngoài ra tôi đã đoạn mã sau:

DbInitializer

public static MyDataContext Create() 
{ 
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDataAccess.MyDataContext, MyDataAccess.Migrations.Configuration>()); 
    return new MyDataContext(ConfigurationManager.ConnectionStrings["MyDataContext"].ConnectionString, null); 
} 

tôi bắt đầu với AutomaticMigrationsEnabled = false; trong quá trình di chuyển Cấu hình xây dựng, vì tôi hiểu rằng điều này sẽ cho phép (và yêu cầu) tôi có quyền kiểm soát nhiều hơn khi di chuyển được áp dụng. Tôi cũng đã cố gắng thiết lập này thành true nhưng với cùng một kết quả.

Tôi đã thêm di chuyển mới khi nhận được lỗi này và phương thức Up bị trống. Tôi đã cập nhật cơ sở dữ liệu cho quá trình di chuyển mới này và một bản ghi đã được tạo trong bảng _migrationHistory, nhưng tôi vẫn nhận được lỗi khi tôi cố gắng chạy ứng dụng. Ngoài ra, dữ liệu hạt giống không được thêm vào cơ sở dữ liệu.

protected override void Seed(MyDataAccess.MyDataContext context) 
{ 
      IdentityResult ir; 

      var appDbContext = new ApplicationDbContext(); 
      var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(appDbContext)); 
      ir = roleManager.Create(new IdentityRole("Admin")); 
      ir = roleManager.Create(new IdentityRole("Active")); 
      ir = roleManager.Create(new IdentityRole("InActive")); 

      var userNamager = new UserManager<User>(new UserStore<User>(appDbContext)); 

      // assign default admin 
      var admin = new User { UserName = "administrator", Email = "[email protected]" }; 
      ir = userNamager.Create(admin, "[email protected]"); 

      ir = userNamager.AddToRole(admin.Id, "Admin"); 
} 

nơi

public class ApplicationDbContext : IdentityDbContext<User> 
{ 
    public ApplicationDbContext() 
     : base("MyDataContext", throwIfV1Schema: false) 
    { 
    } 
    ... 

Câu hỏi đặt ra: Nếu Add-Migration không thấy bất kỳ sự thay đổi trong mô hình, tại sao tôi nhận được lỗi này khi tôi chạy? Tại sao mã hạt giống không bị tấn công? Làm thế nào để sửa lỗi này, hoặc nếu không thể xác định được, làm cách nào để xác định thêm nguyên nhân gốc rễ?

Trả lời

5

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

Đến Package Manager Console và Run - Cập nhật cơ sở dữ liệu--force

+0

Làm việc như say mê! Cảm ơn rất nhiều. Tôi đã bị mắc kẹt trong nhiều ngày và luôn luôn kết thúc nhân bản toàn bộ dự án một lần nữa và xây dựng. Cám ơn bạn một lần nữa! – OhmnioX

+0

vì vậy, bạn có thể cho tôi biết quy trình ... nơi tìm Package Manager Console này không? –

+0

Trong Visual Studio -> Công cụ Menu –

0

Tôi đặt cược ngữ cảnh dữ liệu của bạn không kết nối chuỗi kết nối. Kiểm tra xem nó không được khởi tạo với một localdb (một cái gì đó như (localdb)\v11.0) và không làm việc với điều đó khi bạn có thể nghĩ rằng nó được thiết lập để cái gì khác.

+0

+1 Tôi luôn gặp lỗi này khi tôi không kiểm tra chuỗi kết nối cục bộ của mình từ mã nguồn (Git Cherry-pick Local configs) –

14

Tôi không chắc chắn nếu bạn tìm thấy câu trả lời cho vấn đề của bạn, nhưng câu trả lời này khác mà tôi tìm thấy ở đây thực sự đã làm nó cho tôi: Entity Framework model change error

Tôi thực sự đã kết thúc xóa __MigrationHistory bảng trong SQL Server mà tôi đã không Không biết nó đã được tạo tự động.

Bài báo cũng nói về các tùy chọn để không tạo ra nó tôi nghĩ rằng bằng cách sử dụng hướng dẫn này: Database.SetInitializer<MyDbContext>(null); nhưng tôi đã không sử dụng nó, vì vậy tôi không chắc chắn nếu nó hoạt động như thế

+0

Việc xóa tất cả các hàng dường như cũng có cùng tác dụng. – SharpC

+0

Điều này làm việc như một say mê. Cảm ơn bạn rất nhiều! – MartinJH

0

Vấn đề của tôi đã kết thúc được một cuộc xung đột giữa Migrations tự động được kích hoạt và MigrateDatabaseToLatestVersion initializer như mô tả here.

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