2013-05-05 26 views
20

Đối với một loại phức tạp trong khuôn khổ thực thể có tính chất nullable chỉ, tại sao là một cái gì đó như sau đòi hỏi các loại phức tạp được khởi tạo:loại Complex của Nullable Values ​​

[ComplexType] 
public class Address { 
    public string Address1 { get; set; } 
} 

public class Customer { 
    [Key] 
    public int CustomerId {get;set;} 
    public Address Address {get;set;} 
} 

Cụ thể hơn, nếu bạn không khai báo và gõ địa chỉ, bạn nhận được một "giá trị Null cho thành viên không nullable. Thành viên: 'Địa chỉ'." Theo số this question.

Chừng nào tất cả các thuộc tính trong các loại hình phức tạp là nullable, tại sao nó rằng khuôn khổ thực thể đòi hỏi một thể hiện của Địa chỉ? Vì Address1 là nullable, tại sao nó không thể giả định rằng và tạo bảng (và cột Address_Address1) và giá trị null trong hàng như thể tôi đã tạo ra một cá thể của Address với một null Address1?

Hoặc có cài đặt thuộc tính/thông thạo tôi có thể áp dụng để đạt được điều đó không?

+0

Có thể bạn không được cấp phát bộ nhớ cho địa chỉ bằng toán tử null. –

+2

Đây là một tính năng thực sự tồi tệ của EF. Sử dụng sự phản chiếu trên một đối tượng Address, EF có thể dễ dàng tìm ra những cột nào tạo ra khi tạo bảng. Nó không cần phải có một thể hiện của Address từ thực thể để làm việc đó. Và về việc tạo/cập nhật thực thể, nếu thuộc tính ComplexType là null, thì việc thiết lập các cột đó trong cơ sở dữ liệu thành null là gì? Đây sẽ là một tính năng bổ sung dễ dàng cho phiên bản tiếp theo của EF IMO. – Ibraheem

Trả lời

8

nhìn vào câu hỏi này Entity Framework 5 DbUpdateException: Null value for non-nullable member.

bạn cần khởi tạo loại phức tạp ngay cả khi tất cả các thuộc tính đều rỗng.

+0

Trong trường hợp của tôi, tôi đã không có instantiated loại phức tạp (ví dụ không có tài sản null bằng cách này) và tôi nhận được ngoại lệ này – reddy

8

Ngay cả khi các thuộc tính không có giá trị, thì lớp chứa chúng không phải là. Bạn có thể có Address.Address1 làm null, nhưng Address chính nó phải được khởi tạo.

+0

Tất nhiên địa chỉ lớp là nullable vì nó không phải là một loại giá trị, nhưng vấn đề nằm với EF chính nó và xử lý của nó về "loại phức tạp". – Shautieh

+0

Nó không giới hạn đối với các loại phức hợp EF; nếu 'Address' là null bạn sẽ không thể truy cập vào' Address.Address1' mà không có ngoại lệ tham chiếu null. Mặc dù tôi thừa nhận câu trả lời này đã bị nói xấu; Tôi đã viết vội vàng. Tôi sẽ sửa chữa nó tại một số điểm. – anaximander

+0

Tất nhiên nhưng nếu Địa chỉ không phải là một loại phức tạp ở đây (ví dụ: thuộc tính điều hướng) thì null sẽ hoàn toàn có thể chấp nhận được. Vì vậy, lỗi "Null value for non-nullable member" thực sự được liên kết với thực tế là "Address" được khai báo là một kiểu phức tạp cho EF. – Shautieh

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