申请不能搭建物品

时间:2014-05-10 01:40:43

标签: c# sql asp.net-mvc entity-framework-6 asp.net-mvc-scaffolding

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

错误

  

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

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

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

29 个答案:

答案 0 :(得分:41)

在我的情况下,我将连接字符串从Web.config移到了

<connectionStrings configSource="ConnectionStrings.config"/>

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

  

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

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

答案 1 :(得分:15)

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

base.OnModelCreating(modelBuilder);

答案 2 :(得分:13)

这为我解决了这个问题,

throwIfV1Schema: false添加到DbContext

的基础

如此:

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

答案 3 :(得分:12)

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

问题是因为我在web.config中的<connectionStrings>之前提供了<configSections>标记。在<connectionStrings>解决问题后设置<configSections>

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

答案 4 :(得分:10)

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

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

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

答案 5 :(得分: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文件中有两个<connectionStrings>个元素。 (我在包含我的Entity Framework模型的类库的app.config中粘贴了一个。)

答案 6 :(得分:5)

就我而言,我不得不将我的DBContext构造函数恢复为仅使用静态连接字符串,如web.config中所定义

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

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

答案 7 :(得分:5)

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

运行程序包管理器控制台

工具 - &gt; NuGet包管理器 - &gt;包管理器控制台

删除:

  

UnInstall-Package EntityFramework

重新安装:

  

Install-Package EntityFramework

或者在一个命令中:

  

Update-Package -reinstall EntityFramework

我希望这可以帮助别人,因为我花了一段时间来解决这个问题。

答案 8 :(得分:3)

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

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

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

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

modelBuilder.Entity<EntityModel>();

答案 9 :(得分:3)

我没有运气就尝试了上述大部分内容。

最终奏效的是:

  1. 删除以前动态创建的字符串条目
  2. 删除我的模型(保留所有控制器和视图)
  3. 重新创建ADO.NET实体数据模型 - 使用相同的名称,创建一个与之前名称相同的新连接字符串条目
  4. 然后一切都恢复了工作,减去了3个小时的开发时间。

    1. 将所有属性属性(从备份中)重新添加到表/实体类
    2. 似乎与动态创建的连接字符串和模型有关。会对可能发生的事情有所了解。

答案 10 :(得分:2)

我的解决方案就像将Web Config中的连接字符串名称更改为 DefaultConnection 一样简单。即使我的dbContext有另一个名字!

花了我2个小时才发现这个废话!

答案 11 :(得分:2)

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

预先知道我的问题   <connectionStrings configSource="Configs\ConnectionString.config"/>

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

更改后

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

并且有效

答案 12 :(得分:2)

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

答案 13 :(得分:2)

在via Web.config中连接设置/不一致条目似乎是一个问题。 要解决此问题,请按以下步骤操作:

删除与连接相关的信息(从Web.config盯着&lt; connectionStrings&gt;并删除到目前为止生成的模型。

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

答案 14 :(得分:2)

我也使用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 :(得分:1)

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

答案 16 :(得分:1)

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

答案 17 :(得分:1)

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

  1. 在我的上下文中添加名称到base: base(&#34; name = connectionstringname&#34;)
  2. 我在myconnection字符串中犯了一个错误并修复了它。

答案 18 :(得分:1)

在我的案例中,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 :(得分:1)

如果您有任何机会关注&#34;实体框架6入门首先使用MVC 5&#34;汤姆戴克斯特拉。

我加倍检查一切,我的连接字符串是完美的。我没有意识到的是我复制了另一套我已经拥有的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,我确定这是罪魁祸首。

答案 20 :(得分:0)

使用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>

答案 21 :(得分:0)

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

  1. 将连接字符串移出Web.config文件
  2. 将服务器名称和密码移至Web.config的AppSettings部分中引用的单独文件
  3. 使用SqlConnectionStringBuilder将元素放在一起,然后将其传递给我的上下文类构造函数
  4. 执行此操作后,我无法再创建控制器。要解决这个问题,我不得不......

    1. 将完整的连接字符串放回Web.config并删除对外部连接字符串文件的引用
    2. 将一个无参数构造函数添加到我的上下文类中,并为其指定我的connectionString名称,如下所示: public contextClass() : base("name=connectionStringName") { }

    3. 重建解决方案,再次创建控制器,它有效!

答案 22 :(得分:0)

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

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

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

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

我希望它有所帮助。

最好的问候。

答案 23 :(得分:0)

出于某种原因,当我在web.config中的<configSections>之间评论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>

答案 24 :(得分:0)

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

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

答案 25 :(得分:0)

我有这个:

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

我必须全部删除并放回原处。

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

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

答案 26 :(得分:-1)

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

答案 27 :(得分:-2)

您的上下文类可能会抛出异常。

我在书#34; C#6.0和.NET 4.6 Framework&#34;数据访问层部分的最后一个练习之一是添加日志记录。好吧,我想这会炸毁脚手架巫师。可能未定义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; }
    }
}

答案 28 :(得分:-7)

EF 6.1不支持脚手架模板使用EF 5 Chares