ASP.NET MVC 3添加控制器引发错误“;对象引用未设置为对象的实例;

ASP.NET MVC 3添加控制器引发错误“;对象引用未设置为对象的实例;,asp.net,asp.net-mvc-3,ef-code-first,nuget,signalr,Asp.net,Asp.net Mvc 3,Ef Code First,Nuget,Signalr,当我尝试将控制器添加到ASP.NET MVC 3 intranet项目时,出现以下错误 对象引用未设置为对象的实例 我正在跟随一篇文章来开发信号器应用程序 我怀疑在安装了信号机之后,是否出了什么问题,但对此不是很确定 编辑 型号代码: public class BlogPost { [Key] public int Id { get; set; } [Required] public string Title { get; set; } public st

当我尝试将控制器添加到ASP.NET MVC 3 intranet项目时,出现以下错误

对象引用未设置为对象的实例

我正在跟随一篇文章来开发信号器应用程序

我怀疑在安装了信号机之后,是否出了什么问题,但对此不是很确定

编辑 型号代码:

public class BlogPost
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string Title { get; set; }
    public string Post { get; set;}
}
DbContext:

namespace SignalR.Models
{
    public class BlogPostContext : DbContext
    {
        public DbSet<BlogPost> BlogPosts { get; set; }
    }
}
namespace signer.Models
{
公共类BlogPostContext:DbContext
{
公共DbSet BlogPosts{get;set;}
}
}
控制器:


我对SignalR一无所知,但我很确定问题与视图试图为空对象的属性呈现HTML有关

我浏览了这篇文章,看不到任何对存储数据的实际数据库的引用,也没有提供从您的代码生成数据库的代码(该文章的作者不清楚您将连接到现有数据库还是生成数据库)

如果您还没有现有的数据库,那么您需要告诉您的实体框架代码生成一个数据库;(你需要的东西在帖子的底部)

现在,看看您设置entity类的方式,假设您还没有完成这两篇文章中提到的任何事情,entity Framework应该会自动为您创建一个数据库(这是默认行为-不确定如果您没有安装SQL Server Express或更高版本会发生什么)。是否已检查SQL server实例中是否有数据库?它应该被称为BlogPostContext。在这里填入一些数据,现在应该可以了

那你为什么会遇到这个问题?现在你要么

  • 没有数据库,或者
  • 没有数据的数据库
  • 这意味着您的控制器是

  • 请求不存在的数据,或
  • 从空数据库请求数据
  • 从这两种场景中得到的结果都是空对象。然后将该空对象传递给视图,视图将尝试迭代该空对象并生成异常

    您可以通过两种方式验证这一点

  • 检查视图中的空对象,如果空检查返回false,则仅输出基于模型的HTML
  • 将控制器中的数据库检索逻辑替换为生成一些虚拟博客数据的代码,并将其传递到视图中
  • 对于解决方案1,在您看来类似于以下内容:

    @if (Model == null)
    {
        <span>No data!</span>
    }
    @else
    {
        // All the auto generated view code goes here...
    }
    
    用这样的东西代替它

    BlogPost blogPost = db.BlogPosts.Find(id)
    
    BlogPost blog = new BlogPost()
    {
        Title = "Use Entity Framework Code-First";
        Post = "blog post body goes here..."
    };
    
    IEnumerable<BlogPost> posts = new List<BlogPost>();
    posts.Add(blog);
    
    BlogPost blog=newblogpost()
    {
    Title=“首先使用实体框架代码”;
    Post=“博客帖子正文在这里…”
    };
    IEnumerable posts=新列表();
    添加(博客);
    

    注意:这两种解决方案用于向您演示问题,一旦正确设置了数据库,您应该恢复使用数据检索代码。

    @Benjamin-感谢您的精彩详细回答。因为我首先使用了实体框架代码,并且我假设人们在他们的系统上安装了SQLEXPRESS,这可能就是这里的问题所在

    但是谢谢你的详细解释。看起来这对普拉莫德有帮助

    @Pramodtech-如果你能告诉我们本杰明的哪一条建议对你有帮助,我很乐意更新这篇文章,让它更清晰

    我以为人们会下载代码并用它开火:)


    这确实属于“评论”部分,但我还没有足够的代表发表评论,因此很抱歉将其作为答案发布。

    需要一些代码来帮助您,谢谢!你试过调试你的代码吗?在你的图片上,你选择了
    BlogPost
    ,而不是
    BlogPostContext
    数据上下文类下拉列表中。这是你图像中的“打字错误”吗?因为这里必须提供一个从
    DbContext
    @nemesv my bad>继承的类。这是一个错误的映像。更新了正确的图像。