脚手架控制器不适用于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议工作
例如:
-
在我的上下文中评论OnModelCreating;
-
删除软件包,如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
事情的组合为我工作:
-
升级到Visual Studio 2013 Update 3。
-
将entity framework升级到6.1.1
-
修改上下文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之一。
我已经执行以下来解决这个问题:
- 在包pipe理器中检查您是否有MVCScffolding或T4Scaffolding(vs2013的核心或预发行)
- 卸载依赖于任何MVCScaffolding或T4Scaffolding的所有打包
- 复制CodeTemplates文件夹完整(不要replace你的自定义模板,但要确保你有这个文件夹的根目录的其余文件。我认为你已经做了这部分,因为你已经定制了一些模板,所以你知道这个文件夹的位置)
- build立你的项目并closures它。
- 在pipe理员模式下重新启动Visual Studio
- 打开包pipe理器控制台(它不应该有任何错误,你可以看到PM>没有错误。
- 右键点击Controller文件夹,selectAdd-> New Scaffolding Item或者Choose Add-> Controller都应该问你想要哪一个,然后selectMVC5 scaffold或者哪个出现在列表中。
- 如果您的控制器可能需要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:
-
这是具有类的.cs文件的名称
-
命名空间(或者在你的类的名字前面的一系列名称(点分隔))是正确的。 重要的是要注意,不要在“.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立该项目,一切都应该工作。 干杯!
- 当使用Asp.Net VNext时,application / font-woff2不起作用
- 如何使用AspNet.Identity以Asp.Net MVC5 RTM位login/validation用户?
- OwinStartup没有射击
- asynchronousPartialView导致“HttpServerUtility.Execute阻止…”exception
- 在Asp.net Identity MVC中创buildangular色5
- Web API 2 OWIN不记名令牌的用途是什么?
- 从ASP.NET MVC 5中的Facebook v2.4 API访问OAuth ExternalLoginCallback中的电子邮件地址
- 什么是ASP.NET Identity的IUserSecurityStampStore <TUser>接口?
- 如何在MVC 5项目中从bootswatch或wrapbootstrap实现主题?