Muchos de los errores que he estado solucionando últimamente son el resultado de referencias nulas al acceder a las propiedades de navegación de objetos cargados utilizando entity framework. Creo que debe haber un error en la forma en que estoy diseñando mis métodos. Aquí hay un ejemplo ...Evite NullReferenceException al acceder a EF Navigation Properties
Una tarea contiene muchos roles, cada rol hace referencia a un usuario.
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;
}
Teniendo en cuenta que yo hubiera preguntado mi contexto como éste por error y no se ha cargado usuario ...
var task = context.Tasks.Include(x=>x.Roles).FirstOrDefault;
Y entonces llamar a este método ...
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
}
}
Es posible que haya creado este método con todas las intenciones de cargar Roles y Usuario, pero la próxima vez que lo use puedo olvidar que necesito ambos. Idealmente, la definición del método debería decirme qué datos son necesarios, pero incluso si paso tanto en Tarea como en Roles, todavía faltan Roles-> Usuario.
¿Cuál es la forma correcta de referenciar estas relaciones y asegúrese de que estén cargadas en algo así como este método de impresión? Me interesa un mejor diseño, por lo que "Usar lazy Loading" no es la respuesta que estoy buscando.
Gracias!
EDIT:
Sé que puedo cargar la tarea como esta ...
var task = context.Tasks.Include(x=>x.Roles.Select(z=>z.User)).FirstOrDefault();
Lo que yo quiero saber es ¿Cómo diseño mi método para que cuando vuelva y utilizarlo Dentro de 6 meses, ¿sé qué datos deben cargarse en mis entidades? La definición del método no indica qué es necesario para usarlo. O cómo bloquear contra estas referencias nulas. Tiene que haber un mejor diseño.
posible duplicado de [ ¿Qué es una NullReferenceException en .NET?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net) –
Esto no es diferente de cualquier otro problema 'NullReferenceException'. –