2011-07-27 13 views
9

Tôi có một cột trong cơ sở dữ liệu không thể rỗng và tôi muốn đặt giá trị mặc định là trong cơ sở dữ liệu. Vấn đề là khung thực thể dường như tạo ra một giá trị mặc định (ví dụ, int => 0), và hoàn toàn bỏ qua ràng buộc giá trị mặc định trong cơ sở dữ liệu.Vô hiệu hóa tạo giá trị mặc định của Entity Framework (Mã Đầu tiên)

Có cách nào để vô hiệu hóa giá trị mặc định của khung thực thể này không?

Trả lời

3

Natively, khung Đối tượng không cho phép điều này. Bạn phải làm một số mã cho nó. This answer from another site dường như đã giải quyết được vấn đề cho nhiều người.

Ông "hack" nó (như ông nói) bằng cách làm một cái gì đó như thế:

public partial class YourEntityClass { 
    public YourEntityClass() { 
     this.PropertyNameWithDefaultValue = default(int); 
    } 
} 

Lưu ý 1: Có người kể rằng nó có thể không hoạt động trong EF4

lưu ý cá nhân: Xin lỗi vì tiếng anh của tôi , Tôi thường nói tiếng Pháp.

+1

Tôi đã cập nhật ví dụ hợp lệ. Đây là câu trả lời đúng và nó hoạt động trong tất cả các phiên bản EF. EF không sử dụng các giá trị mặc định của cơ sở dữ liệu cho các thuộc tính có thể được thiết lập từ ứng dụng của bạn - nó được thiết kế. –

+0

Cảm ơn @Ladislav đã sửa câu trả lời của tôi. –

+0

Vì vậy, không có cách nào để làm những gì tôi muốn. Cảm ơn câu trả lời của bạn. –

0

Bạn có thể cập nhật mô hình EDMX để thay đổi giá trị mặc định cho bất kỳ cột nào thông qua cửa sổ Thuộc tính. Tuy nhiên, Entity Framework dường như không tự động nhận các ràng buộc DEFAULT. Không chắc chắn nếu có một cách để làm cho nó làm điều đó.

3

Đôi khi chúng ta cần làm thủ công những gì EF không tự động thực hiện cho chúng tôi.

Trong trường hợp sử dụng EF 4.1 "Mã đầu tiên", tôi thường tạo ra một lớp tách DbInitializer có nguồn gốc từ IDatabaseInitializer, và trong việc thực hiện các phương pháp InitializeDatabase, chỉ cần gọi các

context.Database.ExecuteSqlCommand("ALTER TABLE TABLENAME ... "); 

Bây giờ tại constructor tĩnh của lớp được thừa kế từ DbContext, chỉ cần gọi initializer:

Database.SetInitializer(new DbInitializer()); 

Bằng cách này, nó có thể chỉ định bất kỳ cơ sở dữ liệu DML/DDL lệnh để thay đổi bảng/cột chỉ để chắc chắn DB cũng giống như chúng ta muốn.

+1

Cảm ơn, điều này cũng hữu ích. Chưa thể bỏ phiếu. –

6

Tôi nhận thấy rằng bạn có thể trang trí các trường của mình bằng thuộc tính sau.

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
3

Trường "Đã tính toán" trong EF không giống với các trường có giá trị mặc định trong SQL. Trường được tính toán là trường được tính trên máy chủ và không được thay đổi khi đối tượng được gửi. Nếu bạn đặt một thẻ tính trên một trường, bạn sẽ nhận được mặc định khi bạn tạo đối tượng đầu tiên, nhưng sau đó bạn sẽ không thể thay đổi trường đó sau này. Vì vậy, nếu bạn nhận được một thực thể từ DB thực hiện một thay đổi cho một trường tính toán và sau đó gọi "saveChanges()" trên bối cảnh thực thể của bạn, trường sẽ không bị thay đổi trong DB.

Tốt hơn là sử dụng giá trị mặc định của EF bằng cách đặt Giá trị mặc định cho thuộc tính trong trình chỉnh sửa EDMX.

Đó là một nỗi đau ở mông mà trình cập nhật EDMX không thể đọc mặc định của trường khi có một ánh xạ một đến giữa trường thực thể và trường cơ sở dữ liệu.

+0

quá tệ, chúng tôi đã sử dụng Code First :( –

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