262

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

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

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

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

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

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

有没有人有什么建议?

4

28 回答 28

321

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

于 2012-09-27T13:25:05.050 回答
155

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

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

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

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

于 2013-05-09T08:29:30.787 回答
107

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

在项目上右键单击并选择

或者

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

或者

像这样调用命令

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

然后再试一次

于 2016-02-08T22:03:11.427 回答
34

您可以将连接字符串传递给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...
}
于 2013-10-04T19:53:46.237 回答
10

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

于 2015-10-29T11:22:22.063 回答
9

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

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

于 2012-09-27T13:24:15.067 回答
8

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

于 2015-04-03T22:57:44.613 回答
7
  1. 添加 App.Config 文件
  2. 将项目设置为启动项目。
  3. 确保在部分之后添加连接字符串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>
    
于 2017-12-19T20:51:59.333 回答
4

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

  1. 右键单击解决方案 - 单击属性
  2. 在 Common Properties 下,选择启动项目
  3. 在右侧窗格中选择具有连接字符串的项目(在大多数情况下,它将是 MVC 项目 - 启动解决方案的项目)
于 2015-11-27T16:09:04.757 回答
3

是的,这很愚蠢。您可以通过使用连接构建器来避免复制连接字符串。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)
于 2014-03-01T08:56:42.343 回答
2

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

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

于 2012-09-27T13:25:50.603 回答
2

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

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

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

于 2019-10-05T06:14:33.857 回答
1

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

于 2014-01-06T10:36:40.050 回答
1

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

为避免此问题,您必须:

  1. 您需要启动的 *.config 文件中的连接字符串。
  2. 您需要将 EntityFramework DLL 安装到您的引用中
于 2016-11-27T20:30:28.270 回答
1

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

于 2017-07-06T03:35:16.970 回答
1

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

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

那应该这样做。

于 2019-03-06T22:03:31.383 回答
0

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

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

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

于 2014-08-02T20:18:05.633 回答
0

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

于 2016-02-02T16:58:49.107 回答
0

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

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

于 2016-05-25T12:11:40.680 回答
0

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

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

于 2016-10-05T12:03:22.163 回答
0

在引用类库的“容器”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 文件中搜索名称为的连接字符串与派生类名称相同(在您的情况下,它是我的实体)。

于 2017-07-06T10:25:18.117 回答
0

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

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

于 2017-11-17T00:11:51.153 回答
0

定期迁移

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

Azure 或自动迁移(程序化)

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

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

于 2017-11-28T09:27:20.433 回答
0

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

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

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

于 2019-04-23T20:37:43.210 回答
0

@RyanMann对最佳答案的评论表明:

将连接字符串存储在一个配置文件中,然后在其他项目中引用它们<connectionString configSource="../ProjectDir/SharedConnections.config" />

这是一个很棒的建议!

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

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

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

于 2019-10-10T01:09:33.523 回答
0

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

信用来自 ADN.Network 的 Norman.Yuan。

于 2020-02-14T00:39:41.420 回答
0

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

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

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

希望它对你有帮助:)

于 2020-05-24T16:35:14.043 回答
-2

在 web.config 文件中添加 Connectoinstrnig

<ConnectionStiring> <add name="dbName" Connectionstring=" include provider name too"  ></ConnectionStiring>
于 2014-08-02T20:09:22.913 回答