在应用程序配置文件中找不到名为“MyEntities”的连接字符串

Posted

技术标签:

【中文标题】在应用程序配置文件中找不到名为“MyEntities”的连接字符串【英文标题】:No connection string named 'MyEntities' could be found in the application config file 【发布时间】:2012-09-19 07:11:29 【问题描述】:

我正在使用实体框架和 ASP.NET MVC 4 来构建应用程序

我的解决方案分为两个项目;

一个包含我的数据模型 (.edmx) 文件和一些自定义接口的类库 引用上述类库的“容器”MVC 项目

我的问题是,当我尝试使用“MyEntites”DbContext 时出现以下错误:

找不到名为“MyEntities”的连接字符串 应用程序配置文件。

我猜这个问题与连接字符串位于类库的 app.config 中而不是 MVC 项目中的事实有关。

有人有什么建议吗?

【问题讨论】:

与您的上下文不完全相同(使用 EF6 自动迁移),但是当我在 TFS 上创建子分支并开始处理它时,我遇到了类似错误消息的相同问题。将 mvc 项目标记为启动项目解决了这个问题。 输出 PM> Update-Database -Verbose Using StartUp project 'xxxxx.Web.Home'. Using NuGet project 'xxxxx.Web.Home.Dal'. Specify the '-Verbose' flag to view the SQL statements being applied to the target database. Target database is: 'MovieDatabase-0.0.2' (DataSource: (LocalDb)\v11.0, Provider: System.Data.SqlClient, Origin: Configuration). 【参考方案1】:

正如你所猜测的,这与类库的 app.config 中的连接字符串有关。

将 app.config 类中的条目复制到容器的 app.configweb.config 文件中

【讨论】:

【参考方案2】:

尝试将连接字符串复制到 MVC 项目中的 .config 文件。

【讨论】:

工作完美,但很想知道为什么引用的项目没有使用自己的配置文件来获取连接字符串。 我必须将它添加到我的 MVC 项目的 web.config 中,app.config 没有加载。不知道它为什么要在那里寻找一个单独的项目。 @Alexander,框架加载并使用配置文件来执行程序集。在这种情况下,它是 Web 项目。类库一般没有自己的配置文件。 Enable-Migration 命令在 NuGet COnsole 上下文中运行时会查看启动项目配置文件,不一定是您认为它所在的项目。只需使用应用程序设置项目.config 你想成为启动项目。或者,将连接字符串存储在一个配置文件中,然后通过 在其他项目中引用它们 我收到了这个确切的错误消息,但我的 .config 文件 - 在正确的项目中 - 确实列出了正确的连接字符串。但是,我使用了转换,转换后的 .config 文件中当然没有引用连接字符串。因此,如果您正在使用配置文件转换,则需要注意这一点。【参考方案3】:

您是否在解决方案中使用了多个项目?

因为如果你是,你必须检查的 web 配置是与 de .edmx 文件在同一个项目中的配置

【讨论】:

是的,就是这样。包含连接字符串的项目是一个仅包含 App.config 文件的类库。 MVC 项目似乎没有对此进行检查。 在开发过程中只会检查其项目的app.config,你必须在那里添加 感谢您的回复。我尝试从包含 edmx 文件的项目中复制连接字符串,并将其放在我的 MVC 项目的根 web.config 文件中。不幸的是,它仍然找不到连接字符串。我是否必须以任何方式修改连接字符串? 反之亦然。在开发时,您需要在具有 .edmx 文件的项目上的 app.cofnig 上的 con 字符串。如果你有它,可能名称是错误的。连接字符串的名称应与 .edmx 文件的“实体容器名称”属性相同【参考方案4】:

您是对的,这是因为类库(.edmx 文件所在的位置)不是您的启动/主项目。

您需要将连接字符串复制到主项目配置文件。

如果您的启动/主项目没有配置文件(就像在我的控制台应用程序案例中一样),只需添加一个(启动项目 - 添加新项目 -> 应用程序配置文件)。

更多相关信息可以在这里找到: MetadataException: Unable to load the specified metadata resource

【讨论】:

这个问题的关键答案是类库(.edmx 文件所在的位置)不是您的启动项目。我意识到我的启动项目没有设置为包含我的 web.config 的项目。它是一个带有不同 app.config 的控制台应用程序。因此,如果您要向 Web 解决方案添加控制台应用程序,请确保您的 Web 项目是运行 update-database 时的启动项目! 我出于某种原因卸载了我的主项目,重新加载后我在尝试添加迁移时遇到此错误。再次制作主项目启动项目解决了这个问题。谢谢@Oren 我的启动项目被误改了。这是关键。你的回答真的很有帮助!【参考方案5】:

您可以将连接字符串传递给EntityFramework 并继续您的生活:

public partial class UtilityContext : DbContext

    static UtilityContext()
    
        Database.SetInitializer<UtilityContext>(null);
    

    public UtilityContext()
        : base("Data Source=SERVER;Initial Catalog=DATABASE;Persist Security Info=True;User ID=USERNAME;Password=PASSWORD;MultipleActiveResultSets=True")
    
    

    // DbSet, OnModelCreating, etc...

【讨论】:

我也很开心,因为我找不到解决方案来解决我的启动项目突然停止查找配置文件的原因。我的 app.config 和 .exe.config 出现在我的启动项目 bin 中,但 EntityFramework 找不到我一直使用的连接字符串。我最近确实从解决方案中删除了一些未使用的项目,我想知道这是否与它有关。我确实从解决方案中删除了一个 Web 项目。想知道我的其他项目是否依赖 web.config 或类似的不寻常的东西。 正在运行的项目的配置被所有其他子项目使用。 但是如何设置提供者名称?【参考方案6】:

将 ConnectionString 添加到 MVC 项目 Web.config 文件

【讨论】:

【参考方案7】:

是的,这很愚蠢。您可以使用连接构建器来避免复制连接字符串。 VB.Net 代码(用于生产,但此处稍作修改,因此视为未经测试,乐于帮助解决任何问题),其中我有一个 serverName 变量、一个 databaseName 变量,我将它们传递给一个方法并让它生成连接对我来说:

    Dim EfBuilder As New System.Data.EntityClient.EntityConnectionStringBuilder("metadata=res://*/VMware.VmEf.csdl|res://*/VMware.VmEf.ssdl|res://*/VMware.VmEf.msl;provider=System.Data.SqlClient;provider connection string=""data source=none;initial catalog=none;integrated security=True;multipleactiveresultsets=True;App=EntityFramework""")
   Dim SqlBuilder As New Data.SqlClient.SqlConnectionStringBuilder(EfBuilder.ProviderConnectionString)
                        SqlBuilder.DataSource = serverName
                        SqlBuilder.InitialCatalog = databaseName
                        EfBuilder.ProviderConnectionString = SqlBuilder.ConnectionString
                        Using vmCtx As New VmEfConn(EfBuilder.ConnectionString)

【讨论】:

【参考方案8】:

在 web.config 文件中添加 Connectoinstrnig

<ConnectionStiring> <add name="dbName" Connectionstring=" include provider name too"  ></ConnectionStiring>

【讨论】:

【参考方案9】:

包含 .edmx 文件的项目生成的连接字符串会生成连接字符串,这似乎是 app.config 类文件的保留,这些文件已复制到输出目录并由可执行文件引用以存储运行时配置信息。

这会中断 web 项目,因为没有自动过程将随机 .config 信息添加到 web 项目的 web.config 文件中。

最简单的方法是将配置文件中的连接字符串复制到 web.config 文件的连接部分,而忽略配置文件的内容。

【讨论】:

【参考方案10】:

如果您在解决方案中有多个项目,则在您拥有真实 App.config 的位置开始设置项目。

【讨论】:

【参考方案11】:

将连接字符串复制到已设置为“设置为StartUp项目”的项目中的app.configweb.config文件,如果在数据层项目中使用实体框架-请安装实体框架 nuget 在主项目中。

【讨论】:

【参考方案12】:

如果启动项目更改没有具有连接字符串的项目,也会发生这种情况。

    右键解决方案-点击属性 在通用属性下,选择启动项目 在右侧窗格中选择项目 有连接字符串(在大多数情况下,它将是 MVC 项目 - 启动解决方案的项目)

【讨论】:

是的,它有效。我已经为 EF 创建了一个类库来与 DB 进行通信并且遇到了同样的问题。【参考方案13】:

我刚刚发现解决此问题的最佳方法是将该项目(很可能是一个类库)临时设置为启动项目。这会强制包管理器控制台将该项目用作其配置源。以这种方式设置的部分原因是因为 econfig 文件通常遵循自上而下的模型。经验法则是最接近客户端的项目(例如 MVC 应用程序)是将使用的 web.config 或 app.config。

【讨论】:

【参考方案14】:

确保将项目(使用 DbContext)设为启动

在 app.config(或 web.config)中将连接字符串添加到设置为启动的项目中

这样调用命令

Update-Database -Script -ProjectName '&lt;project name&gt;' -StartupProjectName '&lt;project name&gt;' -ConnectionString 'data source=.;initial catalog=&lt;db name&gt;;integrated security=True;MultipleActiveResultSets=True' -ConnectionProviderName 'System.Data.SqlClient'

然后再试一次

【讨论】:

实际上是包含连接字符串的项目应该设置为启动项目,通常不是你的DbContext文件所在的项目 ... 因此,除了确保 Package Mgr 以正确的层为目标外,该层还需要为 Set as Startup Project - 如上图所示。 (即使按 F5 也无法启动类库) 这救了我的命。即使在包管理器中我将默认项目设置为设置上下文的项目,它仍然没有覆盖。 "但是昨天成功了!完全相同的命令!" => 这个! 最简单的方法=)【参考方案15】:

确保您已将连接字符串放在启动项目的 ROOT web.config 中。

我知道我在这里说明了一些显而易见的事情,但它也发生在我身上——尽管我已经在我的 MVC 项目的 Web.Config 中拥有连接字符串(.edmx 文件被放置在不同的类库项目中)而且我不知道为什么我不断收到异常... 长话短说,我错误地将连接字符串复制到了 Views\Web.Config,这是一种奇怪的疲倦和不滚动到解决方案资源管理器底部的情况。 是的,这些事情也会发生在资深开发者身上:)

【讨论】:

【参考方案16】:

当您在项目中使用图层并在 DataLayer 中定义或安装实体框架并尝试运行您的项目时会发生此问题

为了解决这个问题,从 Edmx 文件所在的层复制连接字符串并将连接字符串粘贴到主 web.config 中。

【讨论】:

【参考方案17】:

我在使用多个项目时遇到了这个问题,使用 web.config 和 app.config 启动 EntityFramework 项目的项目。

为了避免这个问题,你必须:

    您需要启动的 *.config 文件中的连接字符串。 您需要将 EntityFramework DLL 安装到您的引用中

【讨论】:

【参考方案18】:

我也遇到过同样的问题。当我从其他层执行数据访问操作时,我错过了将连接字符串放入启动项目。另外,如果您的启动项目中没有 app.config,则添加 app.config 文件,然后将连接字符串添加到该配置文件。

【讨论】:

谢谢,我的项目加载出现问题,它丢失了“启动项目”。您的回答提醒我要确保带有 Context 文件和 app.config 的项目是 Startup。【参考方案19】:

在 'container' MVC 项目的根 web.config 文件中添加一个连接字符串,引用类库如下:

 <connectionStrings>

  <add name="MyEntities" connectionString="complete connection string here" providerName="System.Data.SqlClient" />

  </connectionStrings>

如果您不想使用“MyEntities”作为连接名称,请随意更改它,但在 MyEntities DbContext 类中进行以下更改:

MyEntities: DbContext
 
   public MyEntities():base("Name-Of-connection-string-you wish to connect") 
 

此错误的原因是,如果我们不指定连接字符串的名称或 DbConext 派生类中的连接字符串(在您的情况下是 MyEntities),则 DbContext 将自动在根 web.config 文件中搜索连接字符串谁的名称与派生类名称相同(在您的情况下是我的实体)。

【讨论】:

【参考方案20】:

我在运行 MSTest 时遇到了这个问题。没有“noisolation”标志,我无法让它工作。

希望这对某人有所帮助。我花了很多时间来弄清楚这一点。一切从 IDE 运行良好。在这种情况下,实体框架有些奇怪。

【讨论】:

【参考方案21】:

定期迁移

有两个选项——这里大家建议的第一个是确保连接字符串在项目的 Web.config 文件中。使用 Azure 应用程序设置中的连接字符串时,这意味着使用 Azure 值覆盖 Web.config 值。

Azure 或自动迁移(程序化)

如果您以编程方式运行迁移,则可以使用第二个选项,它允许您使用动态(或通过 Azure 应用程序设置)获取的连接字符串运行迁移,而无需将其存储在 Web.config 中:

设置配置的TargetDatabase 时,请使用DbConnectionInfo 构造函数,该构造函数采用连接字符串和提供程序名称,而不是仅采用连接名称的构造方法。如果您的连接字符串没有提供程序名称并且您使用的是 SQL Server / Azure SQL,则使用 "System.Data.SqlClient"

【讨论】:

【参考方案22】:
    添加 App.Config 文件 将项目设置为启动项目。

    确保在entityFramework 部分之后添加连接字符串:

    <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"/>
    
    </configSections>
    
    <connectionStrings>
       <!-- your connection string goes here, after configSection -->
    </connectionString>
    

【讨论】:

【参考方案23】:

我没有将项目设置为启动,如另一个答案所示。我对此的贡献 - 在执行 Add-Migrations 和 Update-Database 时,将启动项目指定为 Nuget 包管理器控制台中命令的一部分(不要包含 '[' 或 ']' 字符,这只是为了向您展示您需要将位于那里的文本更改为您的项目名称):

    启用迁移 Add-Migrations -StartupProject [包含数据上下文类的项目名称] Update-Database -StartupProject [与上述相同的项目名称]

应该可以的。

【讨论】:

这样您就可以在程序中包含命令,而不必不断更改启动项目的默认设置。【参考方案24】:

这也可能导致调用代码中引用的 dll 引用不足。一个小小的笨拙的技巧可以挽救你的一天。

我遵循 DB First 方法并在 DAL 类库项目中创建了 EDMX 文件,这是对 BAL 类库的引用,而 BAL 类库又被 WCF 服务引用。

由于我在 BAL 中收到此错误,因此我尝试了上述方法从 DAL 项目的 App.config 中复制配置详细信息,但没有解决。最终,在朋友的提示下,我刚刚向 WCF 项目添加了一个虚拟 EDMX 文件(具有相关的 DB 连接等),因此它导入了所有必要的内容,然后我删除了 EDMX 文件,它就解决了这个问题一个干净的构建。

【讨论】:

【参考方案25】:

这是因为您的上下文类是从 DbContext 继承的。我猜你的 ctor 是这样的:

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

name=... 应更改为您的连接字符串的名称

【讨论】:

【参考方案26】:

@RyanMann 对 the top answer 的评论表明:

将您的连接字符串存储在一个配置文件中,然后通过&lt;connectionString configSource="../ProjectDir/SharedConnections.config" /&gt; 在其他项目中引用它们

这是一个绝妙的建议!

它还可以在 App.config 和 Web.config 文件之间共享连接字符串!

任何想要遵循此建议的人都应该前往this SO answer。 它有一个非常棒的分步指南,用于在解决方案中的多个项目之间共享连接字符串。

唯一需要注意的是configSource 必须存在于同一目录或子目录中。上面的链接解释了如何使用“添加为链接”来解决这个问题。

【讨论】:

【参考方案27】:

尝试在 AutoCAD 插件中使用 EF 时出现此错误。 CAD 插件从 acad.exe.config 文件中获取连接字符串。将上面提到的连接字符串添加到 acad 配置文件中,它就可以工作了。

来自 ADN.Network 的 Norman.Yuan 功劳归于 Norman.Yuan。

【讨论】:

【参考方案28】:

如果您使用的是 MVVM 模型,请尝试将连接字符串复制到项目的所有部分。

例如,如果您的解决方案包含两个项目,类库项目和 wpf 项目,则必须复制后端项目(库类 porject)的连接字符串,并将副本放在 wpf 的 App.config 文件中项目。

<connectionStrings>
  <add name="DBEntities" ... />
</connectionStrings>

希望对你有帮助:)

【讨论】:

以上是关于在应用程序配置文件中找不到名为“MyEntities”的连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

发生了错误。 : 在应用程序配置文件中找不到名为“EmployeeDBEntities”的连接字符串

在应用程序配置文件中找不到名为“x”的连接字符串......但它有效吗?

EF在应用程序配置文件中找不到名为“XXX”的连接字符串。

.NET的EF框架中:在应用程序配置文件中找不到名为“”的连接字符串问题

DB First,ASP Net Core 2.1,EF6:InvalidOperationException:在应用程序配置文件中找不到名为“DataContext”的连接字符串

在应用程序文件中找不到名为“...实体”的连接字符串,但它存在吗?