没有名为&#39的连接字符串;可以在应用程序配置文件中找到

我使用实体框架和ASP。NET MVC 4构建应用程序

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

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

我的问题是,当我试图使用'MyEntites' DbContext时,我得到以下错误:

对象中找不到名为“MyEntities”的连接字符串

.应用配置文件

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

有人有什么建议吗?

266733 次浏览

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

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

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

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

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

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

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

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

更多相关信息可以在这里找到: MetadataException:无法加载指定的元数据资源 < / p >

你可以将连接字符串传递给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...
}

添加ConnectionString到MVC项目Web。配置文件

是的,这很愚蠢。使用连接构建器可以避免复制连接字符串。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)

在web中添加Connectoinstrnig。配置文件

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

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

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

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

如果你在解决方案中有多个项目,那么在你有真理App.config的地方开始安装项目。

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

如果启动项目是改变了连接字符串,也会发生这种情况。

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

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

确保你的项目(使用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'

然后再试一次

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

我知道我在这里说的很明显,但它也发生在我身上-尽管我已经在我的MVC项目的Web中有连接字符串。配置(.edmx文件被放在一个不同的类库项目),我不明白为什么我一直得到一个异常… 长话短说,我复制了连接字符串到Views\Web。错误的配置,在一种疲劳和没有滚动到解决方案资源管理器底部的奇怪组合情况下。 是的,这些事情也发生在资深开发者身上:)

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

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

我有这个问题时,我使用多个项目,启动项目与web。EntityFramework项目的config和app.config。

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

  1. 您需要连接字符串在开始*。配置文件。
  2. 您需要将EntityFramework DLL安装到引用中

我也遇到过同样的问题。我错过了把连接字符串到启动项目,因为我正在从其他层执行数据访问操作。同样,如果你的启动项目中没有app.config,那么添加app.config文件,然后向该配置文件添加连接字符串。

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

 <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"){ }
}

这个错误的原因是,如果我们没有在DbContext的派生类中指定连接字符串或连接字符串的名称(在您的情况下是MyEntities),那么DbContext将自动在根web中搜索连接字符串。配置文件,其名称与派生类名称相同(在您的情况下,它是My Entities)。

我在运行MSTest时遇到了这个问题。如果没有“不隔离”的标志,我就无法让它工作。

希望这能帮助到一些人。花了我很多时间才弄明白。在IDE中一切都运行正常。在这个上下文中,实体框架有些奇怪。

定期迁移

有两个选项——这里每个人都建议的第一个选项是确保连接字符串在Web中。项目配置文件。当使用来自Azure应用程序设置的连接字符串时,这意味着要重写Web。配置值与Azure值。

Azure或自动迁移(编程式)

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

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

  1. 添加一个App.Config文件
  2. 将项目设置为启动项目。
  3. < p > 确保在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>
    

我通过没有将项目设置为启动来得到这一点,正如另一个答案所示。我对此的贡献-当做Add-Migrations和Update-Database时,在Nuget Package Manager Console中指定启动项目作为命令的一部分(不包括'['或']'字符,这只是为了告诉你你需要将位于那里的文本更改为你的项目名称):

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

这样就行了。

这也可能导致在调用代码中没有引用足够的dll引用。一个小小的笨拙的hack可以挽救你的一天。

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

由于我在BAL中得到这个错误,我尝试了上面提到的方法从DAL项目的App.config复制配置细节,但没有解决。最终,在一个朋友的建议下,我只是添加了一个虚拟的EDMX文件到WCF项目(与相关的DB Connectivity等),所以它导入了所有必要的东西,然后我只是删除了EDMX文件,它只是摆脱了一个干净的构建问题。

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

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

name=...应该改变为你的connectionString的名字

@RyanMann在上面的答案上有一条评论,他说:

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

这是一个很棒的建议!

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

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

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

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

功劳归于诺曼。来自adn网的袁。

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

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

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

希望对你有帮助:)