VS 2013 脚手架中的“运行所选代码生成器时出错”
Posted
技术标签:
【中文标题】VS 2013 脚手架中的“运行所选代码生成器时出错”【英文标题】:"There was an error running the selected code generator" in VS 2013 scaffolding 【发布时间】:2013-11-24 02:37:57 【问题描述】:我正在创建一个模型的新视图。 我收到的错误消息是
错误 运行所选代码生成器时出错: '访问路径 'C:\Users\XXXXXXX\AppData\Local\Temp\SOMEGUID\EntityFramework.dll' 被拒绝'。
我以管理员身份运行 VS 2013。
我查看了Is MvcScaffolding compatible with VS 2013 RC by command line?,但这似乎并没有解决问题。
VS2013 C#5 MVC5 VS 2013 开始的全新项目。
【问题讨论】:
请注意,下面已经多次回答了这个问题。包括我发现的特定问题的解决方案,我将其标记为答案。但是感谢持续的反馈,因为这看起来对其他开发人员也有帮助。 顺便说一句,我在 VS2017 中遇到了这个错误,因为我的班级正在使用 expression-bodied 属性(即public string FirstName => "Name";
与 public string FirstName get return "Name"; ;
)
此问题已在 VS 2019 16.0.3 (docs.microsoft.com/en-gb/visualstudio/releases/2019/…) 中修复
这能回答你的问题吗? Error : Package restore failed
【参考方案1】:
VS2013 错误:运行所选代码生成器时出错: ' 类型 'SolutionName.Model.SalesOrder' 的配置已经 已添加...'
我在学习 Pluralsight 课程“使用 EF、MVC、Knockout、Ajax 和验证的父子数据”时遇到了这个问题。我试图添加一个 New Scaffolded Item,使用模板 MVC 5 Controller 和视图,使用 Entity Framework。
我使用的数据上下文类包括对 OnModelCreating 方法的覆盖。在 EF 默认值不足的情况下,需要覆盖添加一些显式数据库列配置。这种覆盖简单、有效且没有错误,但(如上所述)它确实干扰了控制器脚手架代码的生成。
对我有用的解决方案:
1 - 我删除(注释掉了)我的 OnModelCreating 覆盖,并且脚手架模板完成且没有错误消息 - 我的控制器代码按预期生成。
2 - 但是,由于“模型已更改”,尝试构建项目时遇到了瓶颈。由于我的控制器代码现在已正确生成,我恢复(取消注释) OnModelCreating 覆盖,项目成功构建并运行。
【讨论】:
如果可能,您可能希望切换到 EF 6。显然 OnModelCreating 过程发生了一些变化,这使得针对它的编码更加可靠。我注意到在我的新模型库上,我的 OnModelCreating 过程没有问题。 我遵循与上述相同的课程,但使用的是 EF 6(以及 VS 2013)。我得到同样的错误。在上面的步骤1中,记得注释掉OnModelCreating后重新构建解决方案,否则它不会创建一个新的脚手架项目。 这个具体的答案,尤其是上面 olf 的评论,让我在同一个教程上畅通无阻。感谢您在此处添加 cmets。【参考方案2】:问题在于损坏的web.config
和包目录。
我创建了新项目,并将我的代码文件复制到新的工作项目中,后来我返回并在配置文件上运行了 diffs,并在项目本身上运行了一个文件夹 diff。
问题在于,更新使我的配置文件高度垃圾,其中包含大量更新工件,我最终清除了这些工件。
第二个问题是旧项目还一直挂在旧的 DLL 上,这些 DLL 应该被 Nuget 包的应用程序擦除。所以我擦除了obj
和bin
文件夹,然后是包文件夹。完成之后,我就能够将旧项目修复并干净地建造。
我还没有研究为什么配置文件或包文件夹如此无聊,但我假设这是两件事之一。
-
可能是 nuget 包存在缺陷
TFS 源代码控制阻止 nuget 正确更新各种依赖项。
从那时起,在应用任何更新之前,我都会检查所有内容。但是,由于我有一段时间没有更新 EF,我没有证据表明这已经解决了我的 EF 或脚手架问题。
【讨论】:
确保您已检查所有内容,如果您的解决方案由多个项目组成,那么每个项目也必须更新其依赖项。然后再试一次。绝大多数尝试过此操作的人都有效,因此很有可能,您有一个文件或某些仍处于锁定状态的文件,并且阻止了此更正工作。 删除包也对我有用。此处或同一问题的其他答案中列出的其他解决方案均无效。【参考方案3】:我能够解决这个问题,并且对正在发生的事情有了更好的了解。最好的部分是我能够重新创建问题并修复它,以确保我在这里的解释。 解决方案是为数据访问层项目和 Web 项目安装完全相同版本的实体框架。
我的数据访问层使用 NuGet 安装了 Entity Framework v6.0.2,Web 项目没有安装 Entity Framework。尝试使用实体框架模板创建 Web API 控制器时,实体框架会自动安装,但它是旧版本 6.0.0 之一。我很惊讶地看到安装了两个版本的实体框架,在我的数据层项目中较新,在我的 Web 项目中较旧。有一次,我删除了旧版本并在 Web Project 上安装了新版本,问题就消失了。
【讨论】:
好吧,我的解决方案中只有一个项目。 我检查了版本并且完全一样,无论如何,在 web api 项目中我删除了对 EntityFramework 和 EntityFramework.SqlServer 的引用并重新添加它们然后一切正常【参考方案4】:我检查了所有项目,每个项目都有相同版本的实体框架。就我而言,问题在于我的一个项目针对的是 .Net 4.0,而其余项目是 .Net 4.5。
解决方案:
-
对于解决方案 Project->Properties->Application 中的每个项目:将 Target Framework 设置为 .Net 4.5(或任何您需要的)。
工具->管理解决方案的 NuGet 包。找到已安装的“实体框架”。然后单击管理。取消选中所有项目(注意需要 EF 的项目)。现在,重新管理 EF 并检查您需要的项目。
清理和重建解决方案。
【讨论】:
【参考方案5】:我在找到的每个网站上都尝试了每个答案,但没有任何效果......直到这个。迟点发帖以防万一像我这样的人出现并有与我一样令人沮丧的经历。
我的问题与这里的许多问题相似,尝试使用脚手架尝试添加新控制器(ef6、webapi)时出现一般错误消息。我最初能够为大约 15 个控制器使用脚手架,但有一天它就停止工作了。
最终解决方案:
-
为您的解决方案打开硬盘上的工作文件夹。
删除 BIN 文件夹中的所有内容
删除 OBJ 文件夹中的所有内容
清理解决方案、重建解决方案、通过脚手架添加控制器
瞧! (对我来说)
【讨论】:
可能是最好的解决方案:)【参考方案6】:这通常是由无效的Web.config
文件引起的。我遇到了同样的问题,结果我无意中将 html 注释块 <!-- -->
更改为服务器端注释块 @* *@
(通过全部替换操作)。
如果您正在开发 WinForms 应用程序,请尝试查看 App.config
。
【讨论】:
不是我的情况。如果您查看标记为答案的内容,那是依赖项不匹配。它是通过清除 nuget 缓存并仅下载程序集的每个库的最新版本来解决的。虽然我可以看到您的案例可能是损坏的 web.config 文件。 这就是我的答案。我的 configSections 不是配置节点的第一个子节点(我在那里挤压了 connectionStrings 节点)。当然 VS2015 没有提供任何关于模棱两可的错误信息的帮助。直到我撤消了 web.config 更改,我才弄明白。【参考方案7】:我也有同样的问题。 在学习 Pluralsight 课程“使用 EF、MVC、Knockout、Ajax 和验证的父子数据”时首次遇到此问题。
我正在使用 MVC 5、EF 6.1.1 和框架 4.5.2。
即使将我的 VS2013 更新为更新 4,此错误仍然存在。
能够通过在 DbContext 类中将 DbSet 更改为 IDbSet 来规避这个烦人的问题。 答案最初来自here。
//From
public DbSet SalesOrders get; set;
//To
public IDbSet SalesOrders get; set;
【讨论】:
【参考方案8】:解决此问题的方法对我有用:关闭解决方案,然后通过单击项目文件而不是解决方案文件打开项目,添加您的控制器,然后鲍勃您的叔叔
【讨论】:
【参考方案9】:以上都对我没有帮助。
我发现问题的原因是在我的上下文类中覆盖了脚手架项所依赖的 OnModelCreating。通过注释掉这个方法,脚手架就可以工作了。
我真希望微软能发布更少的错误代码。
【讨论】:
这不是错误。 OnModelCreating 向 EF 框架描述您的模型,因此它知道如何使用它。即使您不使用该功能,它仍然在引擎盖下被引用。这就是为什么 DbModelBuilder 作为函数调用的一部分传递的原因。然后,您可以使用 modelBuilder 来扩展您正在使用的各种实体。这些描述涵盖了架构中定义的级联更新和可选引用等内容。 您描述的不是脚手架问题,而是脚手架后问题,您通过覆盖 OnModelCreating 将自己的错误注入代码中。不过,我希望这能让其他人意识到这种风险。非常感谢您的发帖。【参考方案10】:在引用来自不同项目的模型时,我在新的 MVC5 项目中看到了此错误。检查路径,EntityFramework.dll 确实存在。虽然它是只读的。进程监视器显示尝试删除文件时出错。将我的包文件夹(存储在源代码管理中的副本)中的 EntityFramework.dll 设置为可写解决了这个错误,但又提出了另一个错误,说它无法加载 EntityFramework 程序集,因为它与引用的不匹配。我的模型类是在另一个使用旧版本实体框架的项目中定义的。 MVC5 项目引用 EF 6,而模型来自引用 EF 4.4 的项目。在模型的项目中升级到 EF 6 为我修复了它。
【讨论】:
【参考方案11】:对我们来说,它与构建配置有关,我们最近切换到使用的 Debug|x64 构建配置,回想起来似乎是脚手架停止工作的时候。
(我怀疑至少有 10 种不同的事情会导致这种情况,正如一些人发现对他们有用的关于 SO 的各种答案所证明的那样——但对其他人不起作用,所以我不建议我的解决方案适用于所有人)。
什么对我们有用(在 64 位 Windows 7 上使用 VS 2013 Express for Web):
它(脚手架)不在 Debug|x64 Build 配置中工作。但是执行以下操作(似乎每一步都是必要的——无法弄清楚如何以更精简的方式进行操作)似乎对我们有用。
-
首先,切换到 Debug|x86——对解决方案中的所有项目使用解决方案(右键单击)配置管理器。 (调试|任何 CPU 也可以工作)。
清理您的解决方案。
关闭 Visual Studio。 (如果我跳过它,它就无法工作)。
打开 Visual Studio。
打开您的解决方案。
构建您的解决方案。
现在尝试添加脚手架项目;对我们来说,它在这一点上起作用了,我们不再收到关于“运行所选代码生成器时出错”的错误消息。
如果您需要切换回脚手架非工作的构建配置,您可以在暂时搭建好所有需要的脚手架之后执行此操作。在搭建了我们需要的脚手架后,我们切换回了 Debug|x64。
【讨论】:
【参考方案12】:运行所选代码生成器时出错: '升级项目的依赖信息失败。请恢复项目并重试。'
步骤:
-
转到您的项目并将所有 NuGet 包更新到最新版本。
构建您的应用程序直到构建成功。
关闭解决方案并重新打开。
并尝试添加控制器、类等文件。
【讨论】:
【参考方案13】:我在尝试将 Api 控制器添加到我的 MVC ASP.NET Web 应用程序时遇到了这个问题,原因与给出的其他答案完全不同。由于复制和粘贴操作,我不小心包含了一个 StringLength 属性和一个整数属性的 IndexAttribute 声明:
[Index]
[IndexAttribute("NumTrainingPasses", 0), StringLength(50)]
public int NumTrainingPasses get; set;
一旦我摆脱了 IndexAttribute 声明,我就能够为包含有问题的属性 (NumTrainingPasses) 的模型添加一个 Api 控制器。
为了帮助搜索引擎,这是我在解决问题之前收到的完整错误消息:
运行所选代码生成器时出错:
无法检索“Owner.Models.MainRecord”的元数据。物业 'NumTrainingPasses' 不是字符串或字节数组。长度只能是 为字符串或字节数组属性配置。
【讨论】:
【参考方案14】:这通常与您的 Web.config 的格式有关
在错误、消息选项卡下重建解决方案和查找。 如果您对 web.config 有任何格式问题,您将在那里看到它。 修复它,然后重试。
示例:我使用的是 connectionstring
而不是 connectionString
【讨论】:
【参考方案15】:我的问题与这里的许多经验相似,尝试添加新视图或使用脚手架添加新控制器时出现一般错误消息。
我发现 MVC 5 和 EF 6 模型构建器不是好朋友:
我的解决方案:
-
在 Context 类中注释掉 modelBuilder。
清洁解决方案,重建解决方案。
通过脚手架添加视图和控制器
取消注释模型构建器。
【讨论】:
【参考方案16】:如果它对任何人有帮助,我重命名了模型所在的命名空间,然后重新构建项目,然后再次将其重命名,然后重新构建,然后它就可以工作了。
【讨论】:
【参考方案17】:当我在单独的项目(我的数据访问层)中创建模型和上下文时,我在使用 MVC5 和 EF 时经常遇到此错误,我忘记将上下文连接字符串添加到 MVC 项目的 Web.Config。
【讨论】:
【参考方案18】:MSVS2013 Update 4 和 EF 6.0 也有这个问题 我收到的消息是:
there was an error running the selected code generator.
A configuration for type XXXX has already been added ...[]
我有一个大约有 10 个班级的模型。我在项目开始时搭建了元素,没有任何问题。
添加功能几天后,我尝试从模型中构建另一个类,但一个错误阻止了我这样做。
我尝试将 MSVS 从更新 2 更新到更新 4,注释掉我的 OnModelCreating 方法和其他没有运气的想法。
作为继续项目的临时方法,我创建了一个不同的 asp.net 项目,将我的模型类粘贴到那里(我使用的是 fluent api,因此它们上几乎没有注释)并成功创建了我的控制器和视图。
之后,我将创建的类粘贴回原来的项目,并更正了一些错误(主要是 dbset 名称)。
它似乎正在工作,虽然我想我仍然会发现与类之间的关系相关的错误(由于创建时缺乏流畅的配置)。
我希望这对其他用户有所帮助。
【讨论】:
【参考方案19】:当我尝试在***文件夹之外为给定的 Area 创建一个新脚手架时,这发生在我身上。
我的区域 | - File.cs(试图在这里创建一个新的脚手架。失败。)我只是重新选择了我的区域,问题就消失了:
AyArea(添加 => 新的脚手架项目)请注意,在脚手架生成后,您将被带到一个地方,如果不先重新选择该区域,您将无法创建新的脚手架(至少在 VS 2013 中)。
【讨论】:
【参考方案20】: vs2013 更新 4 ef 5.0.0 ibm db2connector 10.5 fp 5更改 web.config 文件,如下所示: 从 ef 标签中删除了 provider/s:
<entityFramework>
</entityFramework>
在配置部分添加了连接字符串标签:
</configSections>
<connectionStrings>
<add name=".." connectionString="..." providerName="System.Data.EntityClient" />
</connectionStrings>
【讨论】:
【参考方案21】:当在我的 MVC 应用程序 EF 引用属性(在“属性”窗口中)“特定版本”被标记为 False 并且在我的其他项目(包含 DBContext 和模型)中,我遇到了同样的问题,该项目是从 EF 引用属性的 MVC 应用程序引用的被标记为真。当我将其标记为 False 时,一切都很好。
【讨论】:
【参考方案22】:在我的例子中,我试图搭建 Identity 元素,但上述方法均无效。解决方案就是以管理员权限打开 Visual Studio。
【讨论】:
问题说OP已经以管理员身份运行VS。【参考方案23】:重建解决方案对我有用。在重建之前,我发现我的“ApplicationDbContext”的引用数为零,这是不可能的,所以重建解决方案,现在一切正常。
【讨论】:
只是出于某种原因添加重建两次为我解决了这个问题。看起来这个错误很笼统,因为有很多不同的答案似乎可以解决这个错误。【参考方案24】:我在 VS 2017 中遇到了这个问题。我将平台目标(在项目属性>构建>常规中)设置为“x64”。脚手架在更改为“任何 CPU”后开始工作。
【讨论】:
【参考方案25】:这可能是由于 nuget 包的版本不同造成的。通过转到解决方案中的 dependencies->nuget packages 文件夹来查看是否有这个。尝试安装所有单个版本,并在如上所述清理 componentmodelcache 文件夹后重新启动 Visual Studio。这应该可以为您完成工作。
【讨论】:
多年前已解决并关闭。这是由源代码管理中的文件锁定引起的。以上是关于VS 2013 脚手架中的“运行所选代码生成器时出错”的主要内容,如果未能解决你的问题,请参考以下文章
在 Mvc 5、EF6、Visual Studio 2013 中使用存储库的脚手架控制器
ASP.NET Core 脚手架在 VS 2017 中不起作用