2015-11-04 15 views
21

Tôi đã thêm một thuộc tính mới vào mô hình hiện tại của mình. Đó là thuộc tính bool với giá trị mặc định là true. Có dữ liệu hiện có trong bảng này và tôi muốn đặt một thuộc tính mới của hàng cụ thể thành false ngay sau khi tạo trường mới, trong phương thức Up.Thay đổi dữ liệu trong di chuyển Phương thức lên - Khung thực thể

public override void Up() 
    { 
     AddColumn("dbo.RequestValidationErrors", "IsBreaking", c => c.Boolean(nullable: false)); 
     using (Context ctx = new Context()) 
     { 
      var validation = ctx.RequestValidationErrorSet.FirstOrDefault(x => x.WordCode == "RequestValidationError.MoreThanOneItemFound"); 
      if (validation != null) 
      { 
       validation.IsBreaking = false; 
       ctx.SaveChanges(); 
      } 
     } 
    } 

Bằng cách này EF ném một lỗi trong quá trình nói

System.InvalidOperationException: Mô hình ủng hộ 'DbContext' bối cảnh đã thay đổi kể từ khi cơ sở dữ liệu đã được tạo ra. Cân nhắc việc sử dụng Code First Migrations để cập nhật cơ sở dữ liệu

Có thể thay đổi cơ sở dữ liệu ở đây hoặc tôi nên làm ở nơi khác?

Trả lời

27

Khi đang di chuyển, tốt hơn nên sử dụng phương thức Sql() để cập nhật dữ liệu cơ sở dữ liệu.

Sql("UPDATE dbo.RequestValidationErrors SET IsBreaking = 0 WHERE WordCode = 'RequestValidationError.MoreThanOneItemFound'"); 

Ngoài ra, bạn nên xác định giá trị mặc định cho cột mới. Vì vậy, giải pháp phải là một cái gì đó như thế này:

public override void Up() 
{ 
    AddColumn("dbo.RequestValidationErrors", "IsBreaking", c => c.Boolean(nullable: false, default: true)); 
    Sql("UPDATE dbo.RequestValidationErrors SET IsBreaking = 0 WHERE WordCode = \"RequestValidationError.MoreThanOneItemFound\""); 
} 

khi di chuyển nó rất mơ hồ. Bạn mong đợi gì từ bối cảnh? Nó có sau trạng thái di chuyển trong các mô hình của nó, nhưng cơ sở dữ liệu có trước khi di chuyển trạng thái trong các bảng. Vì vậy, mô hình và cơ sở dữ liệu không phù hợp. Nếu bạn vẫn khăng khăng sử dụng DbContext trong mã của mình, việc tắt kiểm tra mô hình có thể là giải pháp. Bạn có thể vô hiệu hóa mô hình kiểm tra sử dụng:

Database.SetInitializer<Log4ProContext>(null); 
+0

Cảm ơn bạn đã giải pháp và thiếu giá trị mặc định. – Perrier

7

Nếu bạn muốn sử dụng một khuôn khổ cho những thay đổi như thế này, bạn nên tách những thay đổi cơ sở dữ liệu từ những thay đổi dữ liệu.

Tạo di chuyển chỉ để thay đổi Cơ sở dữ liệu và thực thi.

Sau đó tạo di chuyển mới (các phương thức Up() và Down() sẽ trống). Bây giờ bạn có thể khởi tạo DatabaseContext của mình và sẽ không có lỗi. Bằng cách này bạn có thể sử dụng Framework cho những thay đổi này và thực hiện đúng phương thức Down().

3

Viết dữ liệuNhập cho EF6 có thể là công việc vặt. Chúng tôi cùng nhau tạo một thư viện Tôi chỉ cần tìm nguồn cung ứng ở đây để người khác sử dụng, bổ sung thêm tính năng bị thiếu lâu, hứa hẹn này cho EF6. Chỉ cần viết các lớp bằng cách sử dụng các truy vấn EF thông thường, v.v.

https://github.com/b9chris/Brass9.Data

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