Asp.net mvc 5 对象引用未设置为对象的实例-多个项目(MVC)

Asp.net mvc 5 对象引用未设置为对象的实例-多个项目(MVC),asp.net-mvc-5,entity-framework-6,solid-principles,entity-framework-migrations,Asp.net Mvc 5,Entity Framework 6,Solid Principles,Entity Framework Migrations,我正在使用Contoso大学教程,并尝试使用模块化尝试(模型的单独项目,DAL和WebUI-上图中的顶部图片)和单个项目(包含所有层-下图)。在这两种情况下,解决方案编译时都没有错误。但是,当我在web浏览器中转到学生的详细信息部分时,模块化项目在我转到第二个断点时抛出错误,开始: 例外情况详情: System.NullReferenceException:对象引用未设置为对象的实例 将相同的模型传递到每个项目的视图中 @model ContosoUniversity.Models.Studen

我正在使用Contoso大学教程,并尝试使用模块化尝试(模型的单独项目,DAL和WebUI-上图中的顶部图片)和单个项目(包含所有层-下图)。在这两种情况下,解决方案编译时都没有错误。但是,当我在web浏览器中转到学生的详细信息部分时,模块化项目在我转到第二个断点时抛出错误,开始:

例外情况详情:

System.NullReferenceException:对象引用未设置为对象的实例

将相同的模型传递到每个项目的视图中

@model ContosoUniversity.Models.Student
并且在该行之后发生空引用异常:

@foreach (var item in Model.Enrollments){ 
我认为这可能是
ContosoUniversity.Models
项目与ContosoUniversity项目中的Models文件夹之间的名称空间冲突,但是重命名文件夹并不能解决此问题。是否有其他与多个项目相关的内容会导致此处遇到空值(Enrollments.cs未发送到模型),而不是单个项目? 如果代码中有更深层次的内容,我可以继续使用完整视图代码和模型类


由于这对于新开发人员来说是一个非常容易混淆的错误,因此我编写了一篇文章,详细解释了错误的含义以及如何调试它。TL;DR:
对象引用未设置为对象的实例
是一个运行时错误(因此项目编译良好),当您希望某个变量是某个特定类的实例,但它在运行时实际解析为null时会发生此错误

这通常发生在从数据库中选择对象时,但没有匹配的对象,或者忽略了初始化模型上需要初始化的属性,如列表。根据您发布的代码行,我猜测要么模型本身为null(可能是因为它来自数据库,并且您在将其发送到视图之前没有检查null),要么是因为您忽略了初始化而导致
Enrollments
属性为null,或者,如果您的模型是实体类的实例,则不会将其标记为
virtual

无论何时从数据库请求特定对象,都应始终检查null并进行适当的处理。例如,如果您正在进行“详细”操作,那么您的代码应该如下所示:

public ActionResult Detail(int id)
{
    var foo = db.Foos.Find(id); // potentially null, if no matching id
    if (foo == null)
    {
        return new HttpNotFoundResult();
    }

    return View(foo);
}
如果模型上有列表样式属性,则应始终通过类构造函数或自定义getter对其进行初始化:

public class Foo
{
    public Foo()
    {
        Bars = new List<Bar>();
    }

    public List<Bar> Bars { get; set; }
}
作为延迟加载功能的一部分,Entity Framework会自动覆盖该属性,这样它就永远不会为null,只有在真正没有任何内容的情况下才是空集合。但是,如果忽略了
virtual
关键字,EF将无法执行必要的覆盖来处理此问题


长话短说,您需要找出哪个变量是null,您希望它有一个实际值,然后进行适当的null检查(这是一个好主意),或者找出为什么它是null而不是您期望的值。

显示您的操作方法
public class Foo
{
    private List<Bar> bars;
    public List<Bar> Bars
    {
        get
        {
            if (bars == null)
            {
                bars = new List<Bar>();
            }
            return bars;
        }
        set { bars = value; }
    }
}
public class Foo
{
    public List<Bar> Bars { get; set; } = new List<Bars>();
}
public virtual ICollection<Bar> Bars { get; set; }