应用程序无法搭建项目

Posted

技术标签:

【中文标题】应用程序无法搭建项目【英文标题】:Application can't scaffold items 【发布时间】:2014-06-27 21:11:47 【问题描述】:

我在 VS 2013 Professional 中创建了一个 MVC 5 应用程序,然后首先将 EF 6.1 代码与 SQL Server Express 上的现有数据库一起使用。当我尝试创建视图时,我使用的是“新的脚手架项目...”,然后选择“MVC 5 控制器与视图,使用实体框架”。我选择模型和上下文类,然后单击确定。然后出现以下错误消息并且没有创建代码。我卸载 EF Power Tools 时出现同样的错误。

错误

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

我还尝试卸载/重新安装 VS 2013 和 SQL Server,但没有任何更改。

关于可能导致此错误的任何其他想法?

【问题讨论】:

我唯一的想法是一些参考文献没有指向合适的版本。那是我看到那些莫名其妙的错误的时候。 我也有同样的错误。作为一种解决方法,我能够在我的 DbContext.OnModelCreating() 方法中注释掉任何流畅的 api 代码,并且能够搭建出控制器。然后我取消了有问题的行的注释并继续我的快乐方式。 @AlbertBori 我也是这样。 @AlbertBori - 成功了!谢谢。 @AlbertBori - 这对我也有用,谢谢! 【参考方案1】:

在我的例子中,我将连接字符串从 Web.config 移到了

<connectionStrings configSource="ConnectionStrings.config"/>

当我尝试搭建脚手架时开始收到错误。

运行所选代码生成器时出错:“调用的目标已抛出异常。”

将我的连接字符串移回 Web.config 解决了我的问题。

【讨论】:

在我的 web.config 中有重复的连接字符串条目 我在 configSections 节点之前声明了连接字符串。所以脚手架找不到 EF。 BOOOO MSFT。这是我的问题。 我在 ConfigSection 之前也有连接字符串。在 ConfigSections 为我解决它之后移动它。干杯!!! @DavidMcSpadden 兄弟,您应该将您的评论作为新回复发表。几个小时后,因为你,我解决了我的错误。谢谢!【参考方案2】:

我也有这个问题, 我通过在我的数据库上下文中调用 base.onModelCreating 解决了这个问题

base.OnModelCreating(modelBuilder);

【讨论】:

这解决了我的问题。在配置完所有实体后,将这行代码放在 OnModelCreating 方法的最后。 VS2013 更新 4 我的代码中有这一行,但在添加新的脚手架项目时仍然出现错误。使用 VS 2013 Update 5 和 SQL Server Express 2012 并按照asp.net/mvc/overview/getting-started/…上的教程进行操作【参考方案3】:

这解决了我的问题,

throwIfV1Schema: false 添加到DbContext 的基础

这样:

public MyDbContext() : base("ConectionStringName", throwIfV1Schema: false)  

【讨论】:

这样做后别忘了重建!【参考方案4】:

我在使用带有“ASP.NET MVC5 使用带有实体框架的视图”的脚手架创建控制器时遇到了同样的问题

问题是因为我在 web.config 中的 &lt;configSections&gt; 之前提供了 &lt;connectionStrings&gt; 标签。在&lt;configSections&gt; 解决问题后设置&lt;connectionStrings&gt;

我猜,在搭建脚手架时,ASP.NET MVC 想先解析实体框架,然后是连接字符串,因为我之前提供了连接字符串,所以在解析实体框架版本后它找不到连接字符串,所以它抛出调用问题。

【讨论】:

我将上下文和模型类放在一个单独的项目中,这对我也有用。谢谢。 这解决了我在 VS 2019 ASP.NET(完整框架)MVC 应用程序中的问题。使用实体框架 6.【参考方案5】:

迟到的回复;但是,我发布这个答案是希望有人可以使用这个答案来解决他们的问题。

由于某种原因,如果您的程序无法读取 connectionString 信息(来自 web.config 或其他方式),则会抛出此错误。

确保正确检索有效的 connectionString 信息,没有任何问题。

【讨论】:

【参考方案6】:

我收到了同样的错误信息。 我尝试从“添加控制器”对话框中添加一个新的Data context class,然后我得到了一个不同的错误:

There was an error running the selected code generator:
'Sections must only appear once per config file. See the help topic
<locations> for exceptions.

事实证明,我的 web.config 文件中有两个 &lt;connectionStrings&gt; 元素。 (我从包含我的实体框架模型的类库的 app.config 中粘贴了一个。)

【讨论】:

我经常为自己不做傻事而自豪。今天,这是少数几个之一。很好的接球和接球。【参考方案7】:

在我的例子中,我必须将我的 DBContext 构造函数恢复为只使用静态连接字符串,如 web.config 中定义的那样

当我使用动态创建的连接字符串时,脚手架不起作用。

public MyContext() : base("name=MyContext")  

【讨论】:

【参考方案8】:

我遇到了同样的问题,它不会添加脚手架项目,似乎通过 nuget 包管理器控制台卸载实体框架是可行的

运行包管理器控制台

工具 -> NuGet 包管理器 -> 包管理器控制台

要删除:

UnInstall-Package EntityFramework

重新安装:

Install-Package EntityFramework

或者在一个命令中:

Update-Package -reinstall EntityFramework

我希望这可以帮助某人,因为我花了一段时间才明白这一点。

【讨论】:

这对我有用,必须是它所做的一些配置更改(但是在解决方案或配置文件之一中的什么位置?) @JosephCasey 我不知道,但您必须在某处有某种依赖关系,这会阻止您卸载检查您已安装的软件包并查看它们具有哪些依赖关系。在删除 EntityFramework 之前,您必须先卸载它们。 @JosephCasey 您是否偶然使用了实体框架的 beta 版本,因为它确实具有依赖项 (EntityFramework.Commands)。最好只使用当前版本 6.1.3。 我有 EF 6.1.3。我可以尝试稍后检查。我认为更大的问题是我的方法过时了。【参考方案9】:

这可能有助于解决您的错误。

在我的 OnModelCreating 中,我为每个实体执行此操作:

modelBuilder.Configurations.Add(new EntityTypeConfiguration<EntityModel>);

当我将其更改为以下内容时,我不再收到您收到的错误。

modelBuilder.Entity<EntityModel>();

【讨论】:

我遇到了完全相同的问题,由于某种原因它不喜欢 EntityTypeConfiguration 类,谢谢!【参考方案10】:

我尝试了上述大部分方法,但都没有运气。

最终奏效的是:

    删除之前动态创建的字符串条目 删除我的模型(保留所有控制器和视图) 重新创建 ADO.NET 实体数据模型 - 使用相同的名称,创建一个与以前同名的新连接字符串条目

然后一切都恢复正常,减去 3 小时的开发时间。

    将我的所有属性重新添加(从备份中)到表/实体类中

似乎与动态创建的连接字符串和模型有关。如果您对可能发生的事情有任何想法,将不胜感激。

【讨论】:

【参考方案11】:

就我而言,我解决了 web.config 中连接字符串的问题。

之前我遇到的问题 &lt;connectionStrings configSource="Configs\ConnectionString.config"/&gt;

我不知道为什么,但是vs无法连接数据库并且失败。

改动后

​​>

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

它可以工作

【讨论】:

【参考方案12】:

我的解决方案很简单,只需将我的 Web Config 中的连接字符串名称改回 DefaultConnection。即使我的 dbContext 有另一个名字!

我花了 2 个小时才找出这些废话!

【讨论】:

【参考方案13】:

通过Web.config 连接设置/不一致的条目似乎存在问题。 要解决此问题,请按照以下步骤操作:

删除连接相关信息(以Web.config中的开头并删除到目前为止生成的模型。

现在生成模型,它将在Web.config 文件中添加新的连接条目。生成模型后,构建解决方案,然后开始进行脚手架控制。它会起作用的。

【讨论】:

【参考方案14】:

我在使用 VS 2015 时也遇到了这个问题。我在这里尝试了所有其他解决方案,但都没有成功。事实证明,我的连接字符串(尽管完全按照 MS 告诉我们的方式形成)需要双 \ 才能正常工作。

这是不工作的原因:

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

为了让代码生成器工作,我将其更改为以下内容:

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

注意 V11.0 和数据库名称前面的双 \ 字符。

希望这可以节省其他人一些时间。

更新

这使代码生成工作,但随后应用程序将无法运行,因为 \V11.0 不是有效的连接字符串。在我看来,MS 在解析连接字符串时在其代码生成中存在错误。在运行代码生成以使应用程序再次运行后,我不得不将其更改回单个 \。

更新 2

经过我的合作伙伴的进一步挖掘,我们发现真正搞砸代码生成的是我们更改了“初始目录”字段这一事实。当向导创建项目时,它会自动将初始目录设置为 aspnet--。然后我们将此初始目录字段更改为 DB。这对于运行的应用程序非常有用。它可以很好地访问数据库。但是由于某种原因,这会破坏代码脚手架的生成。通过将初始目录恢复到之前的状态(aspnet--),脚手架再次开始工作(不需要 \V11.0)。

希望对未来的人有所帮助。

【讨论】:

对我来说,您在两次更新之前的回答解决了这个问题。我只是在使用单反斜杠(\)的地方使用了双反斜杠(\\),终于成功了,谢谢。【参考方案15】:

检查实体之间的关系或其他模型设计问题。为了测试,创建没有关系的新类模型并使用 Scaffold 生成控制器和视图。 对我有用。

【讨论】:

“检查关系”这个简单的建议将我引向了正确的方向。就我而言,我在 EF 类上有一个糟糕的 [ForeignKey()] 装饰器。一旦解决了这个问题,问题就解决了。【参考方案16】:

当我对我的模型进行一些更改时,我遇到了同样的错误。我能够解决的唯一方法是 1)停止/终止进程 2)清理解决方案并重建解决方案

【讨论】:

【参考方案17】:

如果您有机会关注 Tom Dykstra 的“使用 MVC 5 开始使用 Entity Framework 6 Code First”。

我仔细检查了所有内容,我的连接字符串很完美。我没有意识到我复制了另一组我已经拥有的 appSettings。往下看

  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusivejavascriptEnabled" value="true" />
  </appSettings>

我的建议是检查 Web.config 的每一寸,我确信这是罪魁祸首。

【讨论】:

【参考方案18】:

在我的例子中,NuGet 将以下提供程序添加到 web.config:

<provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact"/>

当我将提供者更改为

<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>

它解决了这个问题(我花了大约 5 个小时才弄明白 :-( )

【讨论】:

【参考方案19】:

我有同样的错误。以下是我为解决此问题所做的两件事:

    在我的上下文中为 base 添加了名称: base("name=connectionstringname") 我的连接字符串有误并已修复。

【讨论】:

【参考方案20】:

这是(我 99% 的肯定)连接字符串问题。一旦我在 Web.Config 中解决了这个问题,错误就消失了。我首先在另一个项目中使用 DB,一旦我将 DB 第一个连接字符串从 App.config 复制到 web.config(使用相同的名称),它就按预期工作了。

【讨论】:

【参考方案21】:

使用 Visual Studio 2015

升级 mysql 服务器,在此过程中,用于 Visual Studio 的 mysql 从 6.9.7 升级到 6.9.8

在我的网络配置中仍然有对旧 6.9.7 版本的引用

这是我解决问题的 git diff:

-      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices,MySql.Data.Entity.EF6,Version=6.9.7.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"></provider>
+      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices,MySql.Data.Entity.EF6,Version=6.9.8.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"></provider>

【讨论】:

【参考方案22】:

我意识到这个问题现在已经过时了,但我想我会发布解决我问题的方法,以防以后对任何人有所帮助。就我而言,这是其他答案中提到的几件事的组合。为了保护我的连接字符串,我有...

    将连接字符串移出 Web.config 文件 将服务器名称和密码移至 Web.config 的 AppSettings 部分引用的单独文件中 使用 SqlConnectionStringBuilder 将元素放在一起,然后将其传递给我的上下文类构造函数

执行此操作后,我无法再创建任何控制器。为了解决这个问题,我不得不...

    将完整的连接字符串放回 Web.config 并删除对外部连接字符串文件的引用

    向我的上下文类添加一个无参数构造函数,并给它我的 connectionString 的名称,如下所示: public contextClass() : base("name=connectionStringName")

    重新构建解决方案,并再次创建控制器,它成功了!

【讨论】:

【参考方案23】:

每个人。我知道我有点晚了,但我认为分享我对这个问题的经验仍然有效。

我在两个项目中都遇到了这个消息,在这两种情况下,问题都出在连接字符串上。

在第一种情况下,它是“InitialCatalog”而不是“Initial Catalog”(分隔)。

在第二种情况下,服务器名称(数据源参数)错误。

我希望它有所帮助。

最好的问候。

【讨论】:

【参考方案24】:

由于某种原因,当我在 web.config 中的 &lt;configSections&gt; 之间注释 oracle.manageddataaccess.client 部分时,它起作用了。 (VS 2015 和 ODT 12)

<configSections>   
    <section name="entityFramework" type" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <!--<section name="oracle.manageddataaccess.client" />-->
</configSections>

【讨论】:

【参考方案25】:

就我而言,问题是由外部应用设置文件引起的:

<appSettings configSource="appSettings.config" />

将应用设置返回到 web.config 文件解决了该问题。

<appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>

【讨论】:

【参考方案26】:

我有这个:

<appSettings configSource="App_Config\Server\AppSettings.config" />
<connectionStrings configSource="bin\Connections.config" />

我必须删除两者并放回去。

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

删除仍然会导致同样的错误。

【讨论】:

【参考方案27】:

使用:VS 2015 Community Edition 和 EF 6.1.3 还实现了:种子方法,带有个性化的类,并在 web.config 文件中配置为在每次模型更改时运行。 这似乎与 web.config 文件中的一些错误配置有关,就我而言,就像我在这篇文章中看到的文件的其他部分一样,该部分重复了不同的内容,但它重复了主标签当然。部分不合适,超过部分的情况,也是尝试脚手架时相同的行为和窄消息的原因。

【讨论】:

【参考方案28】:

您的上下文类可能会引发异常。

我在“C# 6.0 和 .NET 4.6 框架”一书中继续学习,数据访问层部分的最后一个练习是添加日志记录。好吧,我想这会炸毁脚手架向导。可能没有定义sqllog.txtHttpRuntime 的文件权限......谁知道呢。当我注释掉所有这些东西时,它又起作用了。

namespace AutoLotDAL.EF

    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    using System.Data.Entity.Infrastructure.Interception;
    using AutoLotDAL.Interception;
    using AutoLotDAL.Models;
    using System;
    using System.Data.Entity.Core.Objects;
    using System.Web;

    public class AutoLotEntities : DbContext
    
        //static readonly DatabaseLogger databaseLogger =
        //    new DatabaseLogger($"HttpRuntime.AppDomainAppPath/sqllog.txt", true);

        public AutoLotEntities()
            : base("name=AutoLotConnection")
        
            ////DbInterception.Add(new ConsoleWriterInterceptor());
            //databaseLogger.StartLogging();
            //DbInterception.Add(databaseLogger);

            //// Interceptor code
            //var context = (this as IObjectContextAdapter).ObjectContext;
            //context.ObjectMaterialized += OnObjectMaterialized;
            //context.SavingChanges += OnSavingChanges;
        

        //void OnObjectMaterialized(object sender,
        //    System.Data.Entity.Core.Objects.ObjectMaterializedEventArgs e)
        //

        //

        //void OnSavingChanges(object sender, EventArgs eventArgs)
        //
        //    // Sender is of type ObjectContext.  Can get current and original values,
        //    // and cancel/modify the save operation as desired.
        //    var context = sender as ObjectContext;
        //    if (context == null)
        //        return;
        //    foreach (ObjectStateEntry item in
        //        context.ObjectStateManager.GetObjectStateEntries(
        //            EntityState.Modified | EntityState.Added))
        //    
        //        // Do something important here
        //        if ((item.Entity as Inventory) != null)
        //        
        //            var entity = (Inventory)item.Entity;
        //            if (entity.Color == "Red")
        //            
        //                item.RejectPropertyChanges(nameof(entity.Color));
        //            
        //        
        //    
        //

        //protected override void Dispose(bool disposing)
        //
        //    DbInterception.Remove(databaseLogger);
        //    databaseLogger.StopLogging();
        //    base.Dispose(disposing);
        //

        public virtual DbSet<CreditRisk> CreditRisks  get; set; 
        public virtual DbSet<Customer> Customers  get; set; 
        public virtual DbSet<Inventory> Inventory  get; set; 
        public virtual DbSet<Order> Orders  get; set; 
    

【讨论】:

【参考方案29】:

EF 6.1 不支持脚手架模板使用 EF 5 查尔斯

【讨论】:

以上是关于应用程序无法搭建项目的主要内容,如果未能解决你的问题,请参考以下文章

我用idea搭建springboot项目,多项目时无法访问JSP页面

尚硅谷基于阿里云搭建数据仓库(实时)项目视频发布!

关于vue-cli脚手架搭建的vue项目在手机浏览器无法打开的问题

Spring+Dubbo搭建一个简单的分布式

项目添加环境变量,搭建环境说明

Ionic 项目搭建(参考)