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

Posted

技术标签:

【中文标题】脚手架控制器不适用于 Visual Studio 2013 更新 2【英文标题】:Scaffolding controller doesn't work with visual studio 2013 update 2 【发布时间】:2014-07-17 14:10:34 【问题描述】:

问题:

我已更新到 Visual Studio 2013 更新 2,现在我无法搭建控制器。

问题不是特定于项目的:当我尝试搭建控制器时,我在 ALL 和 ANY 项目中收到以下错误:

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

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

已经用谷歌搜索了这个问题,但各种建议都不起作用

例如:

    在我的上下文中注释掉 OnModelCreating;

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

我已经修改/自定义了一些模板,但更改后它可以正常工作。

编辑:

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

问题消失了。因此,问题出在 Update 2 上。

问题:

是否有人(包括 Microsoft)知道修复?

编辑 2:

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

我添加了 200 点赏金,请按照明确说明的方式解决问题。

【问题讨论】:

是的,并且为控制器和视图搭建上下文选项。 检查您的 EF 组件是否是最新的下载 EF 或其程序集没有问题。我安装了 EF 6.1。如果出现问题,如果未安装 VS 2013 Update 2(即,仅 VS 2013 原始版本),脚手架将无法工作(因为它确实如此)。 我解决了这个问题,将 Visual Studio 2013 更新到更新 3。 我在针对最新的 .net 5(.net core 1.0)运行 VS2015 Update 2 时遇到了同样的问题。我没有做任何非标准的事情,只是一直在关注这个docs.asp.net/en/latest/tutorials/…。还没找到解决办法... 【参考方案1】:

大家好,没有任何效果,真正的答案是您需要删除任何在 web.config 上具有 configSource 且连接字符串需要内联的内容。

编辑:

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

我认为这是因为工具无法遵循 configSource 位置来获取它使用的东西,例如连接字符串和应用程序设置。

如果还没有解决,微软应该会解决这个问题。

编辑 2:

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

【讨论】:

是的。还是为我修好了。 为我工作,我使用 configSource 同时拥有 AppSettings 和 ConnectionStrings。不得不删除两者来修复。谢谢! 在 VS 2013 Update 4 上为我工作,只是将其注释掉并完美运行 VS 2015也有这个问题 我遇到了 VS 2017 的问题! VS的三大版本,都一样的问题?文档或示例中一定有问题。【参考方案2】:

多种方法对我有用:

    升级到 Visual Studio 2013 Update 3。

    将实体框架升级到 6.1.1

    修改上下文配置以使用 IDbSet<...> 而不是 DbSet<...> (我听说这会影响使用异步操作,但在我的情况下显然不是,因为我在我的登录操作等,由 ASP.NET Identity 2 示例 Nuget 包提供)。

这个组合为什么有效,我不知道。但是考虑到 MS 的雷鸣般的沉默,我可能并不孤单。我猜更新 2 只是没有工作......

【讨论】:

仅供参考,我正在更新 4,遗憾的是这些说明没有用 - 同样的错误。 您是否尝试过这里的其他建议?它们对我不起作用,但如果对我有用的东西对你不起作用,那么也许对我不起作用的东西对你有用?只是希望。为什么 MS 布道者不关注这些问题,例如 Scott Hanselman,并写一篇包含解决方案的博客文章,这让我无法理解。 看我的回答...基本上,确保在 web.config 中,configSections 元素是配置中的第一个元素,在 connectionStrings 元素之前 这个解决方案对我有用,虽然我对错误消息有不同的问题:“...要引用现有配置,请使用 Entity() 或 ComplexType()方法。”我已经安装了 VS2013 Update 4 和 EF 6.1.2。我所做的不同是将 T4 模板中的 DbSet<...> 更改为 IDbSet<...> ,您可以通过右键单击 Web 项目 Entity Framework>Customize Reverse Engineer Templates 来添加它。 将 DbSet 更改为 IDbSet 也对我有用。谢谢:)【参考方案3】:

解决方案

确保部分

<connectionStrings>..</connectionStrings>

之后
<configSections>..</configSections>

【讨论】:

【参考方案4】:

请在包管理控制台中运行以下命令:

Uninstall-Package EntityFramework -Force

Install-Package EntityFramework

Uninstall-Package  MvcScaffolding

Install-Package MvcScaffolding

【讨论】:

【参考方案5】:

我在使用 Visual Studio 2013 Update 3 时遇到了同样的问题,但仅适用于使用 Entity Framework 的脚手架。 该问题似乎是由 Entity Framework 6.1.0 与 Visual Studio 2013 Update 2 及更高版本中的脚手架不兼容引起的。

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

卸载-Package EntityFramework -Force

安装包EntityFramework

此答案借自here

升级后,脚手架对我来说工作正常。确保在需要实体框架的每个项目中安装新版本。

【讨论】:

【参考方案6】:

在我的情况下,我解决了 web.config 中连接字符串的问题。

之前我遇到的问题

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

我也不知道为什么,但是vs连不上数据库,失败了。

改动后

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

它可以工作

【讨论】:

我会在有时间重新安装 VS 2013 Update 2 时尝试这样做 连接字符串很好,没有问题,所以可以排除一个。 这为我解决了问题。出于隐私原因,我将 connStrings 放在一个单独的文件中。暂时将它们放回 we,confi 文件(即内联)为我修复了它(然后我将它们移回原样,一旦我有了脚手架控制器和视图)。【参考方案7】:

这里我会用英语多解释一点,这样任何人都可以理解。希望这对任何人都有帮助 这是因为 Visual Studio 无法连接到数据库模型。

当您更改扩展 DbContext 的类中的名称和/或路径并且未在 Web.config 文件中更改它(在项目的最外层:根)时,会发生这种情况。

例子:

假设您搭建了 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(创建、读取、更新、删除)操作,但失败了!

这是为什么呢?

好吧,如果我们去web.config文件,我们可以看到如下字符串:

 <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" />

(此行通常在&lt;add name="DefaultConnection"下方)

这就是问题所在。您需要将 Model1 更改为您提供的名称!

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

它在哪里说:

initial catalog=Skelleton.Models.Model1;

验证:

    它是具有类的 .cs 文件的名称

    命名空间(或类名之前的一系列名称(点分隔))是正确的。重要的是要注意不要将“.cs”扩展名附加到末尾;只是你的文件名。

它应该看起来像这样:

因为我在内部和外部(内部和文件名)都更改了类的名称,并且没有更改了它的位置,我只是将其重命名为 AppContext

完成后。你可以正常使用脚手架;)

希望这会有所帮助!

【讨论】:

抱歉,我没有更改型号名称。我的 web.config 中没有错误。正如问题中明确指出的那样,问题是通过将 Visual Studio 2013 升级到更新 2 产生的。 @awrigley: 啊完美:)。讨厌这些事情发生。以防万一有人提出类似的问题,将答案放在那里。感谢您的澄清。 错误不一样“运行所选代码生成器时出错:'调用目标已引发异常。' 非常感谢!您终于拯救了我的一天。这个对我有用!【参考方案8】:

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

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

【讨论】:

这对我有用。注释掉带有 configSource 属性的行,并从 configSource 文件中复制内容进行脚手架。【参考方案9】:

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

就我而言,我有多个 &lt;entityFramework&gt; web.config 中的部分,我更改配置后问题解决了。

【讨论】:

我发现我不小心将我的实体框架上下文放在了我的 web.config 中的 entityFramework 部分之外【参考方案10】:

我正在使用 VS 2013 Update 4 并且遇到完全相同的问题。将连接字符串从外部文件移动到 web.config 时,它对我有用。所以我想你可以尝试确保在脚手架时不使用connectionString的configureSource属性。

更改前后我的 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>

【讨论】:

【参考方案11】:

这对于没有在他们的解决方案中安装任何脚手架 nuget 包的人很有用

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

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

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

已安装 Visual Studio 2013 社区版 已创建 MVC 项目 创建代码优先模型

编辑连接字符串以连接到真实服务器,如下所示:

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

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

启用迁移 添加迁移初始创建 更新数据库 我启动了网站,我可以注册一个用户。所有表格均已正确创建。

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

右键单击​​“控制器”>“添加”> 控制器...> 带有视图的 MVC 5 控制器,使用实体框架 > 选择我的上下文和要使用的类。它奏效了。

然后我决定先做更多代码更改并从头开始:

我将连接字符串更改如下,以使用 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 数据库。所有表都在那里,因此连接字符串有效。 右键单击“控制器”>“添加”> 控制器...> 带有视图的 MVC 5 控制器,使用实体框架。选择了我的上下文和要使用的类。它不起作用,出现了这个弹出错误:

运行所选代码生成器时出错:'Exception has 被调用的目标抛出。'

解决方案:

经过一番调查,我所做的是将web.config 中的连接字符串改回“真实服务器”(而不是localdb)的初始连接字符串。我再次尝试生成带有视图的控制器。成功了!

所以在我看来是连接字符串问题/错误或 localdb 问题......无法解释。也许 Visual Studio 不喜欢我所做的,我不得不保留我的旧连接字符串...

无论如何,所以现在当我需要脚手架时,我只需将连接字符串更改为有效的字符串。然后为了测试我的网站,我将其改回 localdb 。

【讨论】:

我注意到这并不能回答这个问题,因为我的问题,正如问题中所述,是不同的。我不想让任何人感到困惑,所以-1。 我建议阅读本网站上有关如何使用它的常见问题解答。它不打算成为一个论坛,主题以这种方式摇摆不定,并且与问题不同。相反,它是一个问答网站。即,您提出问题,其他人提出答案。他们不会尝试就类似问题进行“对话”,就像在论坛上可能发生的那样。我无意粗鲁或不公平,只是想像早期其他人对我所做的那样,促进正确使用本网站。 啊好吧我明白了,那我想我应该发布一个相同的问题,让别人告诉我这是重复的,然后回答我自己的问题说这是一个不同的问题(相同的错误消息......不同的问题?真的吗?)并证明重复是因为解决方案不同?我喜欢这个网站,因为我找到了解决方案。而且我不喜欢重复...无论如何,谢谢您的反馈。在下次发布有效和有用的解决方案之前,我会考虑两次...... 对不起,你很明显没有看到。错误相似甚至相同,但您的设置不同。您没有回答我提出的问题,这让其他人感到困惑。 我用粗体写了“给那些没有安装任何脚手架 nuget 包的人”。这不应该让不申请的人真正感到困惑......无论如何......对不起,请随时删除答案。当我在谷歌上搜索这个 VS 错误时,我来到了这里并遇到了另一个类似的 *** 问题。有时要找到好的答案,需要进行多次谷歌搜索......我只是想提供帮助......下次我在我的博客上发布......【参考方案12】:

我已执行以下操作来解决此问题:

    在包管理器中检查您是否有 MVCScffolding 或 T4Scaffolding(核心或 vs2013 的预发行版) 卸载所有依赖于任何 MVCScaffolding 或 T4Scaffolding 的软件包 完整复制 CodeTemplates 文件夹(不要替换您的自定义模板,但请确保您拥有该文件夹根目录中的其余文件。我认为您已经完成了该部分,因为您已经自定义了一些模板,因此您知道该文件夹的位置是) 构建您的项目并关闭它。 在管理员模式下重新启动 Visual Studio 打开包管理器控制台(它应该没有任何错误,你可以看到 PM> 没有错误。 右键单击 Controller 文件夹并选择 Add->New Scaffolding Item 或选择 Add->Controller 都应该询问您想要哪个,然后选择 MVC5 脚手架或列表中出现的那个。 然后,如果您的控制器可能需要选择 DBContext 或存储库等,您将可以选择参数。

这为我生成了控制器和相关视图。

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

【讨论】:

请参阅我的问题中的第 2 点 - 我没有安装任何 MVCScaffolding 或 T4Scaffolding。所以你的解决方案不相关。你没有提到你是否安装了 Visual Studio 2013 Update 2 - 如果你没有,那么你没有回答这个问题,你应该删除你的答案。 我安装了 VS 2013 更新 2。如果您甚至没有 MVCScaffolding 或 T4Scaffolding,请检查您的包文件夹,它可能有一个空文件夹。如果没有安装它们,您可以从第 3 步开始。我没有安装这些,当我将 VS 更新为更新 2 时遇到了这个问题。我必须复制所有模板(仅删除 VB 模板)并保持所有文件原样并按照上面的方法进行操作。然后我安装了 MVCMailer 并且包管理器在 init 上给出了错误,所以不得不删除它们并重试它再次工作。 我今天添加了 MVCMailer 包,它再次添​​加了 T4Scaffolding.Core 并且我重现了相同的错误,删除两个包后错误仍然存​​在,并且在我按照步骤 4-8 后,脚手架再次工作。跨度> 我已经详细查看了您的建议。从本质上讲,他们没有解决我遇到的问题。它们解决了安装 MVCScaffolding 或 T4Scaffolding 的问题。那不是我的情况。第 3 步之后的步骤就是脚手架控制器的标准说明。反正我就是这么做的。抱歉,这绝对不能解决我的问题。【参考方案13】:

对我来说,确保 web.config 文件中的 &lt;configSections&gt; 节点是紧跟在 &lt;configuration&gt; 节点之后的第一个节点。

最初,当我添加我的connectionStrings 时,我实际上已将它放在configSections 之前,这导致脚手架工具损坏。

似乎当脚手架运行并尝试获取连接信息时,它希望 entityFramework 节点的配置部分已经存在,因此它知道要使用哪个 DB 提供程序,但是当我在 configSections 之前有连接字符串时,它没有'不知道使用 LocalDB(这是我的 conn 字符串使用的)。

【讨论】:

【参考方案14】:

我正在运行 VS 2015RC 最终剪辑前的最后一个。不要在这里打折任何解决方案。我的解决方案在 nugget 包管理器下并更新了我的 Microsoft.Aspnet.Mvc 5.2.3 包并解决了我的问题。 我希望对任何使用 VS 2015 的人有所帮助。

【讨论】:

【参考方案15】:

我使用了初始化器,当从 myDbContext 构造器中删除/注释初始化器时,脚手架工作正常

public myDbContext () : base("name=DefaultConnection")
    

        //Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DastanakDbContext>());
        //Database.Initialize(true);
    

【讨论】:

【参考方案16】:

我在更新 4 中遇到了同样的问题。我发现问题来自 &lt;configSections&gt;&lt;/configSections&gt; 没有定义部分名称。我在标签之间添加的修复如下,所有错误都已修复:

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

构建项目,一切正常。干杯!

【讨论】:

以上是关于脚手架控制器不适用于 Visual Studio 2013 更新 2的主要内容,如果未能解决你的问题,请参考以下文章

带有 Visual Studio Update 3 的 .Net Core 1.0.0 中的控制器脚手架在哪里

Git 命令不适用于 Visual Studio Code

MFC 是不是仅适用于 Visual Studio,不适用于 Visual C++ Express?

Visual Studio 2015 不适用于 Apache Cordova 工具

C# 6.0 功能不适用于 Visual Studio 2015

Visual Studio 智能感知不适用于 DHTMLX 套件 5