Entity framework &引用;对象引用未设置为对象的实例;在Visual Studio 2012中使用EF Scaffolding创建新的Web API控制器时

Entity framework &引用;对象引用未设置为对象的实例;在Visual Studio 2012中使用EF Scaffolding创建新的Web API控制器时,entity-framework,asp.net-mvc-4,visual-studio-2012,asp.net-web-api,ef-code-first,Entity Framework,Asp.net Mvc 4,Visual Studio 2012,Asp.net Web Api,Ef Code First,我有一个MVC4/WebAPI项目,有一个实体框架,代码优先的数据模型。当我尝试使用数据上下文和模型使用读/写方法创建一个新的API控制器时,我收到一条警告:“对象引用未设置为对象的实例” 我做了一些搜索,发现一些原因是.csproj文件中不正确的项目类型GUID、MvcScaffolding nuget包的安装不完整以及安装Powershell 3的建议 我已经确保我所有的项目类型guid都是正确的,确保mvcscapfolding包安装正确,甚至还安装了Powershell 3 这些都没有解

我有一个MVC4/WebAPI项目,有一个实体框架,代码优先的数据模型。当我尝试使用数据上下文和模型使用读/写方法创建一个新的API控制器时,我收到一条警告:“对象引用未设置为对象的实例”

我做了一些搜索,发现一些原因是.csproj文件中不正确的项目类型GUID、MvcScaffolding nuget包的安装不完整以及安装Powershell 3的建议

我已经确保我所有的项目类型guid都是正确的,确保mvcscapfolding包安装正确,甚至还安装了Powershell 3

这些都没有解决我的问题。我所能想到的是,我的数据上下文/模型存在问题,尽管它很好地创建了表/关系。代码如下:

上下文:

public class PropertySearchContext : DbContext 
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Property>().HasRequired(p => p.Office).WithMany(o => o.Properties).HasForeignKey(p => p.OfficeId);
    }

    public DbSet<Office> Offices { get; set; }
    public DbSet<Property> Properties { get; set; } 
}
[Serializable]
public class Property
{
    public int PropertyId { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Town { get; set; }
    public string County { get; set; }
    public string Postcode { get; set; }

    public int Bedrooms { get; set; }
    public int Bathrooms { get; set; }

    public string UmbracoNodeId { get; set; }
    public string MainImageUrl { get; set; }
    public string ListingImageUrl { get; set; }
    public int TotalImageCount { get; set; }
    public PropertyType PropertyType { get; set; }
    public PropertyStatus PropertyStatus { get; set; }
    public long Price { get; set; }
    public string ListingUrl { get; set; }

    //Navigation Properties
    public int OfficeId { get; set; }
    public virtual Office Office { get; set; }

    //Meta properties
    public DateTime CreatedAt { get; set; }
    public string CreatedBy { get; set; }
    public DateTime UpdatedAt { get; set; }
    public string UpdatedBy { get; set; }
}
<add name="PropertySearchContext" connectionString="Data Source=MERCURY\SQLEXPRESS;Initial Catalog=DATABASE_NAME;Integrated Security=False;User ID=dbFakeUser;Password=fakePassword;Connect Timeout=10" providerName="System.Data.SqlClient" />
连接字符串:

public class PropertySearchContext : DbContext 
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Property>().HasRequired(p => p.Office).WithMany(o => o.Properties).HasForeignKey(p => p.OfficeId);
    }

    public DbSet<Office> Offices { get; set; }
    public DbSet<Property> Properties { get; set; } 
}
[Serializable]
public class Property
{
    public int PropertyId { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Town { get; set; }
    public string County { get; set; }
    public string Postcode { get; set; }

    public int Bedrooms { get; set; }
    public int Bathrooms { get; set; }

    public string UmbracoNodeId { get; set; }
    public string MainImageUrl { get; set; }
    public string ListingImageUrl { get; set; }
    public int TotalImageCount { get; set; }
    public PropertyType PropertyType { get; set; }
    public PropertyStatus PropertyStatus { get; set; }
    public long Price { get; set; }
    public string ListingUrl { get; set; }

    //Navigation Properties
    public int OfficeId { get; set; }
    public virtual Office Office { get; set; }

    //Meta properties
    public DateTime CreatedAt { get; set; }
    public string CreatedBy { get; set; }
    public DateTime UpdatedAt { get; set; }
    public string UpdatedBy { get; set; }
}
<add name="PropertySearchContext" connectionString="Data Source=MERCURY\SQLEXPRESS;Initial Catalog=DATABASE_NAME;Integrated Security=False;User ID=dbFakeUser;Password=fakePassword;Connect Timeout=10" providerName="System.Data.SqlClient" />

如果有任何帮助,我都会非常感激,因为我已经尝试了每一个建议,但我仍然无法创建带有脚手架的控制器。快把我逼疯了


谢谢

找到了问题。在我的模型中,我有一个自定义枚举类型的属性,它在我的业务项目中。在我的服务项目中,我引用了我的数据模型项目,但没有引用业务项目。因此,添加对模型和业务项目的引用使我能够添加scaffold控制器

看起来很明显,我知道,但它给你的错误信息是如此无益


无论如何,我希望这能帮助任何有相同问题的人,并且不能使用其他建议来解决它。

我添加了一个答案,因为我的问题是相同的,我的解决方案是不同的。它与引用的程序集无关。首先,我相信这只是因为WebAPI项目刚刚创建(从头开始)

我将给出一些基于OP代码的代码示例。首先,从
DbContext
继承的上下文类必须调用作为参数传递连接字符串名称的基本构造函数:

public class PropertySearchContext : DbContext 
{
    public PropertySearchContext () : base("name=PropertySearchContext")
其次,Web API应用程序将在Web.config内部查找名为
PropertySearchContext
的连接字符串。Web.config已经提供了一个
DefaultConnection
,因此我只需添加一个具有正确名称和设置的新连接:

  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\DATABASE_NAME.mdf;Initial Catalog=DATABASE_NAME;Integrated Security=True" providerName="System.Data.SqlClient" />
    <add name="PropertySearchContext" connectionString="Data Source=MERCURY\SQLEXPRESS;Initial Catalog=DATABASE_NAME;Integrated Security=False;User ID=dbFakeUser;Password=fakePassword;Connect Timeout=10" providerName="System.Data.SqlClient" />
  </connectionStrings>

注意:OQ已经具有该连接字符串


第三,也是最后一点,我必须构建WebAPI项目。一旦成功,控制器的创建工作正常。

如果我试图为不包含默认构造函数(不需要参数的构造函数)的模型构建具有视图的控制器,则会出现此错误。向模型中添加一个,然后重试。这不止一次地折磨着我。 较新的编译器没有一个就可以正常工作,就像它没有看到一个一样,它只是为您插入一个。但是,脚手架操作需要在代码中实际声明默认构造函数才能正确操作。我只是希望当你发现错误时它能给你一个更好的解释

因此,对于原始帖子,只需将其添加到类中:

public Property(){}

应该做到这一点。

如果解决方案中有多个项目,请尝试重建所有项目。

这个答案取决于许多因素。就我而言,我对模型本身没有任何问题。经过长时间的观察,我发现我的MVC.NET网站上引用的另一个项目正是阻止脚手架正常运行的项目

我正在做的(有点乏味)是删除引用(同时破坏许多东西),添加我需要的控制器/视图,然后再次添加引用,瞧。没有“对象引用”错误

希望这对你有用