我已经进行了广泛的搜索,并且在这个星球上找不到另一个有这个问题的人......
症状是:
在Visual Studio 2012中,在从VS2010升级的MVC 4.0项目中,配置为从VS2012和VS2010进行双版本编辑。当我右键单击控制器文件夹并从上下文菜单中选择添加 - >控制器...时,我从Visual Studio中得到“未将对象引用设置为对象的实例”错误。
/>
项目中的现有代码运行正常,如果我使用Add-> New Item选项,并从对话框中选择Controller,那么我可以添加一个空白控制器。我只是不能使用上面的方法添加一个类型化的控制器。
但是,如果我创建一个新的MVC4项目,那么我可以使用相同的菜单再次添加类型控制器,因此Visual Studio的安装中不存在该问题,它必须存在于项目文件中。
我还查看了我的项目和新MVC项目之间的参考资料,所有新的项目参考都包含在我的项目中。
有没有人经历过类似的事情?
如何做我解决了这个问题?
答案 0 :(得分:20)
问题似乎是由于MvcScaffolder软件包的安装/注册不完整所致。 以下过程为我解决了我的问题。
启动Visual Studio并打开项目。 打开程序包管理器控制台。 (这是导致解决方案的“技巧”或缺失信息......)
在这里,我看到了由用于注册的PowerShell脚本引起的以下错误:
New-Object : Could not load file or assembly 'System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.
At <ProjectPath...>\packages\MvcScaffolding.1.0.9\tools\registerWithMvcTooling.ps1:163 char:27
+ $newProvider = New-Object <<<< $powerShellScaffolderProviderType($mvcScaffoldingProvider)
+ CategoryInfo : NotSpecified: (:) [New-Object], FileNotFoundException
+ FullyQualifiedErrorId : System.IO.FileNotFoundException, Microsoft.PowerShell.Commands.NewObjectCommand
当我从包管理器控制台检查注册的脚手架时,我得到了:
PM> get-defaultscaffolder
DefaultName ScaffolderName
Action MvcScaffolding.Action
Controller MvcScaffolding.Controller
CustomScaffolder T4Scaffolding.CustomScaffolder
CustomTemplate T4Scaffolding.CustomTemplate
DbContext T4Scaffolding.EFDbContext
Mailer Mailer.Razor
Repository T4Scaffolding.EFRepository
UnitTest MvcScaffolding.ActionUnitTest
View MvcScaffolding.RazorView
Views MvcScaffolding.Views
很明显,脚手架配置为使用MvcScaffolding包,但包有注册错误。
快速搜索错误,提供了此链接http://mvcscaffolding.codeplex.com/discussions/437692,该链接引用了https://visioautomation.codeplex.com/discussions/397034,建议安装PowerShell 3,它实际上是{3}}提供的Windows Management Framework 3.0的一部分。我在提示时选择了Windows6.1-KB2506143-x64.msu文件,因为我正在运行Win 7-64位。
安装后重新启动PC,重新打开Visual Studio和项目,然后查看软件包管理器控制台。如果错误消失了,那么控制器问题也是如此。
答案 1 :(得分:2)
我在Win8上的VS2012上遇到了这个问题,我们在VS2010上开始开发项目的工作,我无法使用CTRL + M,CTRL + C快捷方式创建新的控制器。
打开任何项目并在Manage Nuget包下重新安装MvcScaffolder及其依赖项已经为我修复了这个问题。
根本没必要重启VS2012。
答案 2 :(得分:1)
也许你现有的项目在.csproj文件中有错误的ProjectTypeGuids元素? 适用于MVC4的是{E3E379DF-F4C6-4180-9B81-6769533ABE47}。
尝试比较新项目和现有项目中的项目类型。
答案 3 :(得分:1)
安装Windows Management Framework 3.0的首选答案无效。下载“Windows6.1-KB2506143-x86.msu”在我的Windows 7 32位系统上不起作用。它因“更新不适用于您的计算机”错误而失败。
使用Manage Nuget Packages重新安装MVCscaffolding不起作用。
我的ProjectType GUID是正确的。
已安装Microsoft Web Developer Tools。
删除并重新创建解决方案无效。
有必要从安装磁盘修复Visual Studio 2012安装以解决此问题。
答案 4 :(得分:0)
安装“Microsoft Web Developer Tools”为我解决了这个问题。相关:
How do I open a csproj with ProjectTypeGuids 349c5851-65df-11da-9384-00065b846f21?
答案 5 :(得分:0)
更新Windows6.1-KB2506143-x64.msu对我有用。完整的SpyWare软件扫描后问题就出现了。我认为它删除了比平常更多的东西。所以,恢复正常生活。
答案 6 :(得分:0)
我有同样的问题,我首先使用数据库,这是因为我已经更改了.edmx contex.tt以生成了连接名称设置为自定义方法的contex.cs,
:base(sqlHelper.getMainConnectionString())
每次,在更改/更新.edmx之前,我需要将连接名称更改为它的创建默认值:
:base(“name = YourWebconfigConnectionstringName”)
重建项目并再次运作
答案:
检查webconfig上的connectionstring字符串和提供程序参数,然后删除并重新创建.edmx,这将强制生成器重建所有数据库对象,包含元数据或删除设计器中的所有表,将contex.cs更改为默认创建名称,重建项目,添加表格,重建项目,它再次工作。
答案 7 :(得分:0)
此问题表现在使用VS2017的目标MVC5项目上。
与原始操作系统一样,尝试使用针对ApplicationUser的EF脚手架执行添加控制器的新项目。错误 最初会显示,直到注册一个用户强制创建数据库为止。之后,添加脚手架无故障地工作。我认为这是有道理的,因为实体在第一次注册之前并不存在,但是如果比我更了解的人有更准确的解释,我会立即纠正。但是因为Add Controller使用了一个新项目,就像最初的op确定的那样,它似乎不是VS2017的安装问题。这表明taret项目出了问题。
此时,目标项目中已执行团队资源管理器中的全部撤消,以使项目返回到先前的工作点。虽然这可以通过获取特定版本来实现,但对于此目标项目,所需要的只是全部撤消。 提醒:对于此特定项目,在撤消之前,使用程序包管理器将数据库回滚到与撤消全部匹配的起始点。如果执行特定于get的版本,请务必检查数据库是否需要回滚到正确的配置。重置所有项目更改后,添加控制器操作期间不再出现object reference not set to an instance of an object
错误,修复目标项目中的错误。
我有点不情愿地发布这个回复,因为我无法复制错误,我不确定实际上是什么原因造成了问题,但如果一个人正处于一个项目的中间,这是一个特别令人讨厌的错误添加控制器启动失败。我想如果有人遇到这个问题并且回滚当前的更改集可能会为他们修复它,就像我一样,他们会感激不尽。如果我稍后确定导致问题突然出现的活动模式,我肯定会在这篇文章中添加更多内容。
答案 8 :(得分:0)
我正在运行VS 2019 Enterprise,ASP.NET Core 3.1.3
在尝试采用数据库优先方法后,我试图使用实体框架(EF)向MVC控制器添加视图。
我遇到这个问题是因为我的ER模型中的一张表缺少主键。
该表已连接到我试图通过另一个具有主键的表为其生成MVC控制器的表,因此最初我没有注意到该错误。