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


246

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

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

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

我的问题是,当我尝试使用“MyEntites” 的DbContext我得到了以下错误:

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

我认为问题与连接字符串位于类库的app.config而非MVC项目中有关。

有没有人有什么建议?


15
与您的上下文不完全相同(使用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).
机械对象

Answers:


309

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


63
可以完美运行,但是很想知道为什么引用的项目没有使用自己的配置文件来获取连接字符串。
空头

7
@亚历山大老问题,但是的,我也想知道为什么。
Kehlan Krumme 2013年

22
@Alexander,框架为正在执行的程序集加载并使用配置文件。在这种情况下,它是Web项目。类库通常没有自己的配置文件。
kiprainey 2014年

24
在NuGet COnsole上下文中运行时,Enable-Migration命令会查看“启动项目”配置文件,不一定是您认为会在其中的项目。只需将要启动的app.config设置为项目即可。项目。(可选)将连接字符串存储在一个配置文件中,然后通过<connectionString configSource =“ ../ ProjectDir / SharedConnections.config” />引用它们在其他项目中
Ryan Mann

3
我得到了这个确切的错误消息,但是我的.config文件-在正确的项目中-确实列出了正确的连接字符串。但是,我正在使用转换,并且转换的.config文件中当然没有引用连接字符串。因此,如果您正在使用配置文件转换,则需要注意这一点。
MortenNørgaard2015年

143

没错,这是因为类库(.edmx文件所在的地方)不是您的启动/主项目。

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

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

可在此处找到更多相关信息: MetadataException:无法加载指定的元数据资源


8
关键的答案是类库(.edmx文件所在的地方)不是您的STARTUP项目。我意识到我的启动项目没有设置为包含web.config的项目。这是一个具有不同app.config的控制台应用程序。因此,如果要将控制台应用程序添加到Web解决方案中,请在运行更新数据库时确保Web项目是启动项目!
2013年

1
由于某种原因,我已经卸载了主项目,并且在重新加载主项目后,尝试添加迁移时出现此错误。再次使主项目启动项目解决了该问题。感谢@Oren
Azadrum 2014年

2
我的启动项目被错误地更改了。那是关键。您的回答确实有帮助!
Fabio Milheiro

98

确保您启动项目(使用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'

然后再试一次


2
实际上是包含连接字符串的项目应设置为启动项目,通常不是您的DbContext文件所在的项目
Raymond Wang

1
...因此,除了确保Package Mgr定位到正确的层外,还需要与Set as Startup Project上面的屏幕截图相同的层。(即使您按了F5键,也无法启动类库)
bkwdesign 2016年

3
这救了我一命。即使在程序包管理器中将默认项目设置为设置了上下文的项目,它仍然没有覆盖。
garfbradaz

1
“但是昨天有效!完全一样的命令!” =>这!
Simon_Weaver

1
最简单的方法=)
亚历山大

29

您可以将连接字符串传递给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和<appname> .exe.config出现在我的启动项目bin中,但是EntityFramework找不到我一直使用的连接字符串。我最近确实从解决方案中删除了许多未使用的项目,我想知道这是否与它有关。我确实从解决方案中删除了一个Web项目。想知道我的其他项目是否依赖于web.config或类似的东西。
GrayDwarf's

正在运行的项目的配置由所有其他子项目使用。
塞杰·萨根

1
但是如何设置提供商名称?
FizxMike

9

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

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


8

如果您在解决方案中有多个项目,则将启动项目设置为已启动,并在其中放置真值App.config。


7

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


4

如果启动项目也发生改变的一个,它具备连接字符串

  1. 右键单击解决方案-单击属性
  2. 在“公共属性”下,选择启动项目
  3. 在右窗格中,选择具有连接字符串的项目(在大多数情况下,这将是MVC项目-启动解决方案的项目)

是的,它有效。我为EF创建了一个与数据库进行通信的类库,并且遇到了同样的问题。
Satinder Sidhu 2015年

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

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)

2

您在解决方案上使用了多个项目吗?

因为如果是这样,则必须检查的Web配置是与.edmx文件在同一项目中的配置。


是的,就是这种情况。包含连接字符串的项目是仅包含App.config文件的类库。MVC项目似乎并未对此进行检查。
jjc99 2012年

在开发过程中,它只会在其项目上检查app.config,您必须在该位置添加
Diego

感谢您的回覆。我尝试从包含edmx文件的项目中复制连接字符串,并将其放在我的MVC项目中的根web.config文件中。不幸的是,它仍然找不到连接字符串。我必须以任何方式修改连接字符串吗?
jjc99 2012年

相反。在开发期间,您需要在具有.edmx文件的项目上的app.cofnig上使用con字符串。如果您拥有它,则名称可能不正确。连接字符串的名称应该是相同的名称为“实体containr名”您的.edmx文件的属性
圣地亚哥


1

当我使用多个proyects(对于EntityFramework项目使用web.config和app.config来启动proyect)时,我遇到了这个问题。

为避免此问题,您必须:

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

1

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


1
谢谢,我的项目加载出现问题,它丢失了“启动项目”。您的回答提醒我确保带有Context文件和app.config的项目是Startup。
马斯特罗

1

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

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

那应该做。


这样,您可以将命令包含在过程中,而不必不断地更改启动项目而不是默认值。
JakeJ

1

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

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

name=... 应该更改为您的connectionString的名称


0

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

由于没有自动过程将随机的.config信息添加到该Web项目的web.config文件中,因此该Web项目中出现问题。

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


0

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


0

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

我知道我在这里说的很明显,但是这也发生在我身上-尽管我已经在MVC项目的Web.Config(.edmx文件放置在另一个类库项目中)中添加了连接字符串,但我无法没弄清楚为什么我总是遇到异常...长话短说,我将连接字符串错误地复制到Views \ Web.Config中,这是疲倦和无法自拔的奇怪组合-解决方案资源管理器方案。是的,经验丰富的开发人员也会遇到这些问题:)


0

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

因此,要解决此问题,请从Edmx文件所在的层复制连接字符串,然后将连接字符串粘贴到主web.config中。


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


0

运行MSTest时遇到此问题。没有“ noisolation”标志,我无法使其正常工作。

希望这对某人有帮助。花了我很多时间来解决这个问题。IDE一切正常。在这种情况下,关于实体框架有些奇怪。


0

定期迁移

这里有两个选项-每个人都建议的第一个选项是确保连接字符串位于项目的Web.config文件中。使用来自Azure应用程序设置的连接字符串时,这意味着使用Azure值覆盖Web.config值。

Azure或自动迁移(程序化)

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

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


0

这也可能导致调用代码中引用的dll引用不足。一个小的笨拙的hack可以节省您的时间。

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

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


0

@RyanMann 在最重要的答案上有一条评论建议:

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

这是一个很棒的建议!

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

任何想要遵循此建议的人,都应继续进行此SO回答。它在解决方案中的多个项目之间共享共享字符串方面,提供了非常好的分步指南。

唯一的警告是configSource必须存在于同一目录或子目录中。上面的链接说明了如何使用“添加为链接”解决此问题。


0

尝试在AutoCAD插件中使用EF时出现此错误。CAD插件从acad.exe.config文件获取连接字符串。将如上所述的连接字符串添加到acad配置文件中,即可使用。

归功于ADN.Network的Norman.Yuan。


0

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

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

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

希望对您有帮助:)


-2

在web.config文件中添加Connectoinstrnig

<ConnectionStiring> <add name="dbName" Connectionstring=" include provider name too"  ></ConnectionStiring>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.