脚手架控制器不适用于Visual Studio 2013更新2

问题:

我已经更新到Visual Studio 2013更新2,现在我不能脚手架控制器。

问题不是项目特定的:当我尝试搭build控制器时,在ALL和任何项目中出现以下错误:

There was an error running the selected code generator: 'Exception has been thrown by the target of an invocation.' 

它正在更新到Visual Studio 2013更新2之前正在工作。

已经把问题解决了,但没有任何的build议工作

例如:

  1. 在我的上下文中评论OnModelCreating;

  2. 删除软件包,如MvcScaffolding等(我没有安装,它不适用于任何项目);

我已经修改/定制了一些模板,但在更改之后它正在工作。

编辑:

我卸载了Visual Studio 2013 Update 2,从而还原到Visual Studio版本12.0.21005.1 REL。

问题已经消失。 因此,Update 2的问题是相当明显的。

题:

有人(包括微软)知道一个修复吗?

编辑2:

Farruk Subhani的回答并没有解决这个问题:这个问题明确指出,移除对MVCScaffolding的引用并不能解决问题。

我已经添加了200点奖励,请清楚地说明问题。

嘿所有你没有任何工作,真正的答案是你需要删除任何在web.config上有一个configSource的连接string需要内联。

编辑:

有人指出,它只需要<configSettings><appSettings><connectionStrings>标签不使用configSource属性。 而且他仍然可以在其他地方使用configSource属性,例如重写器标签。

我认为这是工具不能跟随它使用的东西,如连接string和应用程序设置的configSource位置。

微软应该在这个问题上,如果还没有修复。

编辑2:

即使认为@awrigley已经标记了他的答案是正确的,这是一个已知的Visual Studio错误。 我已经设法告诉了,我想这将很快得到一些注意。 https://github.com/aspnet/Tooling/issues/169#issuecomment-144197015

事情的组合为我工作:

  1. 升级到Visual Studio 2013 Update 3。

  2. 将entity framework升级到6.1.1

  3. 修改上下文configuration使用IDbSet <…>,而不是DbSet <…>(我听说,这可能会影响使用asynchronous操作,但不是显然在我的情况下,因为我在我的login操作等,由ASP.NET Identity 2示例Nuget包提供)。

为什么这个组合起作用,我不知道。 但是,接下来,由于MS的沉默,我可能并不孤单。 我猜更新2只是没有工作…

请在软件包pipe理器控制台中运行以下命令:

 Uninstall-Package EntityFramework -Force Install-Package EntityFramework Uninstall-Package MvcScaffolding Install-Package MvcScaffolding 

我在Visual Studio 2013 Update 3中遇到了同样的问题,但仅限于使用Entity Framework的脚手架。 这个问题看起来是由于Entity Framework 6.1.0和Visual Studio 2013 Update 2及更高版本中的脚手架之间的不兼容造成的。

要升级EF,请执行以下操作:

卸载包Package EntityFramework -Force

安装包EntityFramework

这个答案是从这里借来的

升级后,脚手架工作正常。 确保在需要entity framework的每个项目中安装新版本。

在我的情况下,我解决了与web.config中的连接string的问题。

在我面前的问题

  <connectionStrings configSource="Configs\ConnectionString.config"/> 

我不知道为什么,但vs不能连接到数据库,并失败。

改变之后

 <connectionStrings> <add name="UIBuilderContext" connectionString="metadata=res:/ ..... " /> </connectionStrings> 

它的工作

对我来说,我必须确保<configSettings><appSettings> ,& <connectionStrings>标签使用configSource属性。

我仍然可以使用其他地方的configSource属性,例如rewriter标签。

我认为,这个问题是由于web.config文件中的configuration错误造成的。

在我的情况下,我有web.config中的多个<entityFramework>部分,并更改configuration后解决问题。

我在VS 2013 Update 4上,有完全相同的问题。 当从外部文件移动连接string到web.config时,它适用于我。 所以我想你可以尝试确保在搭build脚本时不使用configureSource属性作为connectionString。

改变之前和之后我的web.config之前:

 <connectionStrings configureSource="connectionStrings.config/> 

后:

 <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net configSource="log4net.config" /> <connectionStrings> <clear/> <add name="DefaultConnection" connectionString="Data Source=.;Initial Catalog=YourDb;Integrated Security=False;User ID=sa;Password=YourPassword!#;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> </connectionStrings> 

确保部分

 <connectionStrings>..</connectionStrings> 

在之后

 <configSections>..</configSections> 

对那些在解决scheme中没有安装任何脚手架nuget软件包的人来说很有用。

事实上,我没有安装mvcscaffolding或t4scaffolding,并得到相同的错误消息。

在我的情况下,问题/错误是由更改连接string引起的。

在这里,我有什么/步骤重现。

  • 已安装的Visual Studio 2013社区版
  • 创buildMVC项目
  • 创build代码第一个模型
  • 编辑的连接string连接到一个真实的服务器,如下所示:

     <add name="DefaultConnection" connectionString="server=myserv;database=MyCustomerDB;user id=myuser;password=mypass" providerName="System.Data.SqlClient" /> 

然后,我通过nuget启用迁移,如下所示:

  • 启用的迁移
  • 添加迁移InitialCreate
  • 更新数据库
  • 我开始了网站,我可以注册一个用户。 所有表格都正确创build。

然后我使用脚手架选项创build了一个控制器:

  • 右键单击“控制器”>“添加”>控制器…>使用entity framework的MVC 5控制器与视图>select我的上下文和一个类使用。 有效。

然后,我决定做更多的代码第一次改变,从头开始:

  • 我改变了连接string如下,使用localdb

     <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-Test-20141126094523.mdf;Initial Catalog=aspnet-Test-20141126094523;Integrated Security=True" providerName="System.Data.SqlClient" /> 

然后我继续说:

  • 删除了迁移文件夹
  • 在nuget控制台中使用与上面相同的命令重新启用迁移
  • 开始网站和注册用户
  • 检查了mdf分贝。 所有表都在那里,所以连接string工作。
  • 右键单击“控制器”>“添加”>控制器…> MVC 5控制器与视图,使用entity framework。 select我的上下文和一个类来使用。 它没有工作,这个popup错误出现:

运行选定的代码生成器时发生错误:“exception已被调用的目标引发”。

解:

经过一番调查后,我所做的是将web.config的连接string更改为“真正的服务器”(而不是localdb)中的连接string。 我再次尝试生成带有视图的控制器。 有效!

所以在我看来,连接string问题/ bug或localdb的问题…不能解释它。 也许Visual Studio不喜欢我所做的,我必须保持我的旧连接string…

无论如何,所以现在当我需要脚手架,我只是改变连接string到工作。 然后testing我的网站,我把它改回localdb之一。

我已经执行以下来解决这个问题:

  1. 在包pipe理器中检查您是否有MVCScffolding或T4Scaffolding(vs2013的核心或预发行)
  2. 卸载依赖于任何MVCScaffolding或T4Scaffolding的所有打包
  3. 复制CodeTemplates文件夹完整(不要replace你的自定义模板,但要确保你有这个文件夹的根目录的其余文件。我认为你已经做了这部分,因为你已经定制了一些模板,所以你知道这个文件夹的位置)
  4. build立你的项目并closures它。
  5. 在pipe理员模式下重新启动Visual Studio
  6. 打开包pipe理器控制台(它不应该有任何错误,你可以看到PM>没有错误。
  7. 右键点击Controller文件夹,selectAdd-> New Scaffolding Item或者Choose Add-> Controller都应该问你想要哪一个,然后selectMVC5 scaffold或者哪个出现在列表中。
  8. 如果您的控制器可能需要selectDBContext或存储库等,您将会select您的参数。

这为我制定了pipe制员和相关的意见。

我在该文件夹中添加了一个名为QuickView的自定义分部视图,但是这个脚手架过程并没有考虑到这种情况,只生成了默认情况下正在执行的视图。 我不确定是否需要在文件中添加这些自定义视图,以便脚手架也可以生成这些视图。

我会在这里用英文解释一下,所以任何人都可以理解。 希望这有助于任何人出现这是因为Visual Studio无法连接到数据库模型。

当您在扩展DbContext的类中更改名称和/或path时,会发生这种情况,并且不会在Web.config文件(位于项目的最外面部分:根)中更改它。

例:

想象一下,你搭build了DbContext代码:

a)您右键单击项目中的一个文件夹并添加了一个“ADO.NET实体数据模型”,并将其命名为“Model1”

你得到下面的代码:

  public class Model1 : DbContext { // Your context has been configured to use a 'Model1' connection string from your application's // configuration file (App.config or Web.config). By default, this connection string targets the // 'Skelleton.Models.Model1' database on your LocalDb instance. // // If you wish to target a different database and/or database provider, modify the 'Model1' // connection string in the application configuration file. public Model1() : base("name=Model1") { } // Add a DbSet for each entity type that you want to include in your model. For more information // on configuring and using a Code First model, see http://go.microsoft.com/fwlink/?LinkId=390109. // public virtual DbSet<MyEntity> MyEntities { get; set; } } 

在这里输入图像说明

b)现在,你已经决定你刚刚写的名字是坏的,所以你把它改为AppContext

你的代码现在看起来像这样:

  public class AppContext : DbContext { // Your context has been configured to use a 'AppContext' connection string from your application's // configuration file (App.config or Web.config). By default, this connection string targets the // 'Skelleton.Models.AppContext' database on your LocalDb instance. // // If you wish to target a different database and/or database provider, modify the 'AppContext' // connection string in the application configuration file. public AppContext() : base("name=AppContext") { } // Add a DbSet for each entity type that you want to include in your model. For more information // on configuring and using a Code First model, see http://go.microsoft.com/fwlink/?LinkId=390109. // public virtual DbSet<MyEntity> MyEntities { get; set; } } 

在这里输入图像说明

然后,您尝试使用视图脚手架CRUD(创build,读取,更新,删除)操作,并且失败!

在这里输入图像说明

这是为什么?

那么,如果我们去web.config文件,我们可以看到下面的string:

  <add name="Model1" connectionString="data source=(LocalDb)\v11.0;initial catalog=Skelleton.Models.Model1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> 

(这一行通常在<add name="DefaultConnection"

在这里输入图像说明 问题出在哪里。 您需要将Model1更改为您发出的名称!

在这种情况下,应该说“AppContext”而不是“Model1”

它说:

 initial catalog=Skelleton.Models.Model1; 

validation:

  1. 这是具有类的.cs文件的名称

  2. 命名空间(或者在你的类的名字前面的一系列名称(点分隔))是正确的。 重要的是要注意,不要在“.cs”扩展名后加上“ 只是你的文件的名字。

它应该是这样的: 在这里输入图像说明

因为我改变了内部和外部的类名(在它和它的文件名),并没有改变它的位置,我只是把它重命名为AppContext

在这之后完成。 你可以正常脚手架;)

希望这可以帮助!

对我来说,确保web.config文件中的<configSections>节点是紧接在<configuration>节点之后的第一个节点。

最初,当我添加了我的connectionStrings ,我实际上已经将它放在了configSections之前,这使Scaffold工具中断了。

好像当脚手架运行并试图抓取连接信息时,它期望entityFramework节点的configuration部分已经存在,因此它知道使用哪个DB提供者,但是当我在configSections之前有连接string时,它不知道使用LocalDB(这是我的连接string正在使用)。

我正在运行VS 2015RC最后一次裁减之前。 不要打折这里的任何解决scheme。 我的解决scheme是在金块包pipe理器和更新我的Microsoft.Aspnet.Mvc 5.2.3包,并解决了我的问题。 我希望能帮助任何人使用VS 2015。

我使用初始化,当从myDbContext constructer删除/评论初始化,脚手架工作正常

 public myDbContext () : base("name=DefaultConnection") { //Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DastanakDbContext>()); //Database.Initialize(true); } 

我在更新4中遇到了同样的问题。我发现问题来自<configSections></configSections>没有定义节名称。 我把标签之间的修正如下,所有的错误是固定的:

 <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 

build立该项目,一切都应该工作。 干杯!