24

Tôi khá mới trong thế giới ASP .NET MVC. Có lẽ, đó là lý do tôi không thể giải thích cho chính mình nguyên nhân của việc gì, đối với tôi, một vấn đề khó chịu.Tại sao Entity Framework trả về null List <> thay vì rỗng?

Tôi có một lớp với thời gian chuyển đổi Một-Nhiều.

class MyClass{ 
    public List<OtherClass> otherClasses {get;set;} 
} 

Khi tôi kiên trì một thể hiện của lớp này, tôi điền vào đó là mối quan hệ với một danh sách rỗng <>

MyClass myClass = new MyClass(){ otherClasses = new List<OtherClass>() } 
context.myClass.Add(myClass); 

Vấn đề là, khi tôi cố gắng để lấy ví dụ đó, và cho bất kỳ lý do nào, tôi cố truy cập danh sách đó, hệ thống cung cấp cho tôi Ngoại lệ Tham chiếu Null ...

Câu hỏi của tôi là: tại sao EF không trả về danh sách trống thay vì danh sách rỗng? Đặc biệt trong trường hợp này, tôi kiên trì nó với một danh sách trống?

Có cách nào để tránh xác minh nếu các phiên bản là null?

+0

lớp khung thực thể của bạn là gì? –

Trả lời

21

Bạn nên để thực thể tạo danh sách đó trong hàm tạo. EF không tạo ra các bộ sưu tập phụ thuộc, và hy vọng thực thể đó sẽ làm như vậy.

Vì vậy, trường hợp của bạn, bạn sẽ làm cho tổ chức của bạn như thế này:

class MyClass{ 
    public List<OtherClass> _otherClasses {get;set;} 

    public MyClass() { 
     _otherClasses = new List<OtherClass>(); 
    } 
} 
+0

Điều này chắc chắn sẽ giải quyết được vấn đề của tôi! Cảm ơn bạn đã giúp đỡ! Vì vậy, EF gọi constructor đối tượng trước khi tải nó với các thông tin liên tục, phải không? –

+0

Không, EF không "gọi" hàm tạo. C#. Bất cứ khi nào một đối tượng được tạo ra, hàm tạo được gọi.Ngay cả khi EF vật hoá các đối tượng từ db. –

+0

OK! Cảm ơn! –

16

Đặt bộ sưu tập otherClasses ảo. Điều này sẽ cho phép EF tải xuống bộ sưu tập.

class MyClass{ 
    public virtual List<OtherClass> otherClasses {get;set;} 
} 

Nếu không, hãy sử dụng phương pháp tải mong muốn với phương thức Include.

context.myClass.Include(m => m.otherClasses).SingleOrDefault(m => m.Id == foo); 
+1

Thật vậy, tải chậm giải quyết vấn đề của tôi ... Nhưng tôi đang cố gắng để tránh tải chậm vì nó đã cho tôi Thông tư tham số Serialization lỗi khi tôi đã được sử dụng JSON yêu cầu. Dù sao, tôi rất vui vì sự giúp đỡ của bạn. Cảm ơn! –

+0

Đối với các vấn đề tham chiếu vòng tròn, bạn có thể sử dụng các thuộc tính như 'JsonIgnore' để ngăn chặn một thuộc tính điều hướng liên kết ngược được tuần tự hóa. – Jess

0

Vì vậy, nếu tôi hiểu đúng thì bạn được thêm một sản phẩm nào List<OtherClass> với bối cảnh và sau đó cố gắng để lấy nó.

Tôi đoán bạn phải suy nghĩ về cách ngữ cảnh sẽ theo dõi và truy vấn các thực thể nằm trong ngữ cảnh của nó. Việc này thường được thực hiện bởi Key của pháp nhân. Trong ví dụ của bạn, bạn đã không cho pháp nhân đó Key, do đó, ngữ cảnh không có xử lý trên thực thể.

Do đó, khi bạn truy vấn, ngữ cảnh không tìm thấy đối tượng và trả về giá trị rỗng.

Nếu bạn muốn khởi tạo thực thể mới, tôi khuyên bạn nên cung cấp ít nhất một số Key (thường là thuộc tính Id), sau đó chọn bằng khóa đó khi bạn tra cứu sau.

Hy vọng điều này sẽ hữu ích.

+0

Thực tế, các lớp thực sự của tôi có tất cả Thuộc tính ID. Đó chỉ là một ví dụ mà tôi quên bao gồm ID: P. Dù sao, cảm ơn câu trả lời của bạn! –

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