5

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

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

我确保我所有的项目类型 guid 都是正确的,确保 MvcScaffolding 包安装正确,我什至安装了 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" />

任何对此的帮助将不胜感激,因为我已经尝试了每一个建议,但我仍然无法创建带有脚手架的控制器。快把我逼疯了!

谢谢!

4

5 回答 5

4

发现了问题。在我的模型中,我有一个自定义枚举类型的属性,该属性位于我的业务项目中。在我的服务项目中,我引用了我的数据模型项目,但没有引用业务项目。因此,添加对模型和业务项目的引用允许我很好地添加脚手架控制器。

我知道似乎很明显,但它给你的错误信息是如此无用!

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

于 2013-06-09T11:37:54.967 回答
3

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

我会给你一些基于 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 项目。成功后,控制器的创建工作正常。

于 2016-02-18T03:44:34.163 回答
0

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

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

public Property(){}

应该做的伎俩。

于 2018-01-16T19:35:54.970 回答
0

这个答案取决于很多事情。就我而言,模型本身没有问题。经过长时间的查找,我发现另一个项目(在我的 MVC .NET 网站上引用)是阻止脚手架正常运行的项目。

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

希望这对你有用

于 2020-02-14T15:04:43.840 回答
0

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

于 2019-05-29T19:50:25.187 回答