我最近修复的许多错误是在访问使用实体框架加载的对象的导航属性时导致null引用的结果。我相信我在设计我的方法方面一定存在缺陷。这里有一个例子...访问EF导航属性时避免NullReferenceException
任务包含许多角色,每个角色引用一个用户。
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
}
}
我可能已经建立了这个方法,每个意图加载角色和用户,但下次我使用它时,我可能会忘记我需要两个。理想情况下,方法定义应该告诉我什么数据是必要的,但即使我同时传递任务和角色,我仍然缺少角色 - >用户。
什么是正确的方式来引用这些关系,并确保它们是像这种打印方法加载?我对更好的设计感兴趣,所以“使用懒加载”不是我正在寻找的答案。
谢谢!
编辑:
我知道我可以加载这样的任务...
var task = context.Tasks.Include(x=>x.Roles.Select(z=>z.User)).FirstOrDefault();
我想知道什么是我该怎么设计我的方法,这样,当我回来,并用它从现在起6个月,我知道需要在我的实体中加载哪些数据?方法定义并不指出使用它的必要条件。或者我如何阻止这些NullReferences。必须有更好的设计。
可能重复[什么是.NET中的NullReferenceException?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net) – 2011-12-20 18:31:59
这与其他任何'NullReferenceException'问题没有什么不同。 – 2011-12-20 18:32:18