2015-06-24 20 views
19

Tôi đang sử dụng EF6 để lưu trữ các phiên bản của lớp report trong cơ sở dữ liệu của tôi. Cơ sở dữ liệu đã chứa dữ liệu. Nói rằng tôi muốn thêm một tài sản để report,Di chuyển mã đầu tiên: Cách đặt giá trị mặc định cho thuộc tính mới?

public class report { 
    // ... some previous properties 

    // ... new property: 
    public string newProperty{ get; set; } 
} 

Bây giờ nếu tôi đi đến các gói quản lý giao diện điều khiển và thực hiện

add-migration Report-added-newProperty 
update-database 

tôi sẽ nhận được một tập tin trong thư mục '/ Migrations' thêm một newProperty cột vào bảng. Điều này hoạt động tốt. Tuy nhiên, trên các mục cũ hơn trong cơ sở dữ liệu, giá trị cho newProperty bây giờ là một chuỗi rỗng. Nhưng tôi muốn nó được, ví dụ, "cũ".

Vì vậy, câu hỏi của tôi là: Làm cách nào để đặt giá trị mặc định cho thuộc tính mới (thuộc bất kỳ loại nào) trong tập lệnh di chuyển (hoặc ở nơi khác)?

Trả lời

31

Nếu bạn thấy đoạn mã di cư tạo ra bạn sẽ thấy AddColumn

AddColumn("dbo.report", "newProperty", c => c.String(nullable: false)); 

Bạn có thể thêm defaultValue

AddColumn("dbo.report", "newProperty", 
      c => c.String(nullable: false, defaultValue: "old")); 

Hoặc thêm defaultValueSql

AddColumn("dbo.report", "newProperty", 
      c => c.String(nullable: false, defaultValueSql: "GETDATE()")); 
+4

Sẽ được tốt đẹp nếu nó kéo đúng trong [DefaultValue (xyz)] thuộc tính như đã định nghĩa trong mô hình mã đầu tiên. Thay vì phải nhớ những cột nào cần gì mỗi khi bạn thêm di chuyển; phải chỉnh sửa tệp đã tạo, tiếp theo là hoạt động bình thường của Update-Database dựa vào tệp đã thay đổi đó. Tôi tự hỏi nếu có thể ghi đè hành vi không thông minh đó ... Tôi không thể tin rằng không có ai cải thiện điều này. Chắc chắn tôi không phải là người duy nhất thất vọng bởi điều này với mô hình định danh AspNet mặc định ... LockoutEnabled, EmailConfirmed, AccessFailedCount. tất cả các lỗi, tất cả các vấn đề – Barry

+1

Điều này dường như không hoạt động với MySQL-EF. 'defaultValue' không đặt giá trị và 'defaultValueSql' tạo một ngoại lệ ("hình khối văn bản blob hoặc cột json không thể có giá trị mặc định") ... cách duy nhất còn lại là sử dụng SQL thô. :( – Efrain

3

Bạn cần phải có sự thay đổi trong kịch bản di chuyển của bạn bổ sung thêm ty/cột như thế này:

AddColumn("dbo.reports", "newProperty", c => c.String(nullable: false, defaultValue: "test")); 
-5

Tôi thấy rằng chỉ cần sử dụng Trình khởi tạo thuộc tính tự động trên thuộc tính thực thể là đủ để hoàn thành công việc.

Ví dụ:

public class Thing { 
    public bool IsBigThing { get; set; } = false; 
} 
+0

Điều gì là sai với điều đó? –

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