Многие из ошибок, которые я исправил в последнее время, являются результатом нулевых ссылок при доступе к свойствам навигации объектов, загруженных с использованием структуры сущностей.Я считаю, что в разработке моих методов должен быть недостаток.Вот пример ...
Задача содержит много ролей, каждая роль ссылается на пользователя.
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;
}
Учитывая, что я бы по ошибке запросил свой контекст и не загрузил бы пользователя ...
var task = context.Tasks.Include(x=>x.Roles).FirstOrDefault;
И затем я вызываю этот метод...
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
}
}
Возможно, я построил этот метод с каждым намерением загрузить роли и пользователя, но в следующий раз, когда я его использую, я могу забыть, что мне нужны оба.В идеале определение метода должно сказать мне, какие данные необходимы, но даже если я передам и Task, и Roles, мне все еще не хватает Roles-> User.
Как правильно ссылаться на эти отношения и быть уверенным, что они загружены примерно таким же способом печати?Я заинтересован в лучшем дизайне, поэтому «Использовать Lazy Loading» - это не тот ответ, который я ищу.
Спасибо!
РЕДАКТИРОВАТЬ:
Я знаю, что могу загрузить задачу следующим образом ...
var task = context.Tasks.Include(x=>x.Roles.Select(z=>z.User)).FirstOrDefault();
То, что я хочу знать, какя должен разработать свой метод так, чтобы, когда я вернусь и использую его через 6 месяцев, я знал, какие данные должны быть загружены в мои объекты?Определение метода не указывает, что необходимо для его использования.Или как мне заблокировать эти NullReferences.Должен быть лучший дизайн.