Nhiều lỗi mà tôi đã sửa gần đây là kết quả của tham chiếu null khi truy cập các thuộc tính điều hướng của các đối tượng được nạp bằng khung thực thể. Tôi tin rằng phải có một lỗ hổng trong cách tôi đang thiết kế các phương pháp của tôi. Dưới đây là ví dụ ...Tránh NullReferenceException khi truy cập EF Navigation Properties
Nhiệm vụ chứa nhiều vai trò, mỗi vai trò tham chiếu đến người dùng.
public class Role
{
public int Id;
public int User_Id;
public string Type;
}
public class User
{
public int Id
public string Name;
}
public class Task
{
public int Id;
public string Name;
public string Status;
public List<Role> Roles;
}
Xét rằng tôi sẽ truy vấn bối cảnh của tôi như này do nhầm lẫn và không được nạp tài ...
var task = context.Tasks.Include(x=>x.Roles).FirstOrDefault;
Và sau đó tôi gọi phương thức này ...
public void PrintTask(Task task)
{
Console.WriteLine(task.Name);
Console.WriteLine(task.Status);
foreach(var r in task.Roles)
{
Console.WriteLine(r.User.Name); //This will throw NRE because User wasn't loaded
}
}
Tôi có thể đã xây dựng phương pháp này với mọi ý định để tải Vai trò và Người dùng nhưng lần sau tôi sử dụng nó tôi có thể quên rằng tôi cần cả hai. Lý tưởng nhất là định nghĩa phương thức nên cho tôi biết dữ liệu nào là cần thiết, nhưng ngay cả khi tôi chuyển vào cả Task và Role, tôi vẫn còn thiếu Roles-> User.
Cách thích hợp để tham chiếu các mối quan hệ này và đảm bảo rằng chúng được tải bằng thứ gì đó như phương pháp in này? Tôi quan tâm đến một thiết kế tốt hơn, do đó, "Sử dụng tải Lazy" không phải là câu trả lời tôi đang tìm kiếm.
Cảm ơn!
EDIT:
Tôi biết tôi có thể tải các nhiệm vụ như thế này ...
var task = context.Tasks.Include(x=>x.Roles.Select(z=>z.User)).FirstOrDefault();
Những gì tôi muốn biết là làm thế nào để thiết kế phương pháp của tôi để khi tôi quay trở lại và sử dụng nó 6 tháng kể từ bây giờ tôi biết dữ liệu nào cần được tải trong các thực thể của tôi? Định nghĩa phương thức không chỉ ra những gì cần thiết để sử dụng nó. Hoặc làm thế nào để tôi chống lại những NullReferences. Phải có một thiết kế tốt hơn.
thể trùng lặp của [ Một NullReferenceException trong .NET là gì?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net) –
Điều này không khác với bất kỳ vấn đề 'NullReferenceException' nào khác. –