No connection string named 'MyEntities' could be found in the application config file
我正在使用实体框架和ASP.NET MVC 4构建应用程序
我的解决方案分为两个项目;
- 包含数据模型(.edmx)文件和一些自定义接口的类库
- 引用上面类库的"container"MVC项目
我的问题是,当我尝试使用"myEntities"dbContext时,会得到以下错误:
No connection string named 'MyEntities' could be found in the
application config file.
我想问题与连接字符串位于类库的app.config中而不是MVC项目有关。
有人有什么建议吗?
尝试将连接字符串复制到MVC项目中的.config文件。
您是对的,这是因为类库(其中.edmx文件)不是您的启动/主项目。
您需要将连接字符串复制到主项目配置文件中。
如果您的启动/主项目没有配置文件(就像在我的控制台应用程序中一样),只需添加一个(启动项目-添加新项->应用程序配置文件)。
更多相关信息可在此处找到:MetadataException:无法加载指定的元数据资源
确保将项目(使用dbContext)设置为启动状态
或
添加到在app.config(或web.config)中设置为启动连接字符串的项目中
或
像这样调用命令
然后再试一次
你只需将连接字符串传递给
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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... } |
如果您在解决方案中有多个项目,那么将项目设置为在您有truth app.config的地方启动。
正如您所猜测的,这与类库的app.config中的连接字符串有关。
将条目从class app.config复制到容器的
将连接字符串复制到已设置为"设置为启动项目"的项目中的app.config或web.config文件,如果在数据层中使用实体框架,请在主项目中安装实体框架nuget。
如果启动项目更改为没有连接字符串的项目,也会发生这种情况。
确保在
1 2 3 4 5 6 7 8 9 | <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> |
是的,这很愚蠢。可以使用连接生成器避免复制连接字符串。vb.net代码(在生产中使用,但在这里稍作修改,因此将其视为未经测试的代码,很乐意为任何问题提供帮助),其中我有一个servername变量,一个databasename变量,我将它们传递给一个方法,并让它为我生成连接:
1 2 3 4 5 6 | 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配置与de.edmx文件位于同一项目中。
当我使用多个proyect时,我遇到了这个问题,分别是web.config的start proyect和entityframework项目的app.config。
为了避免这个问题,您必须:
我也面临同样的问题。当我从其他层执行数据访问操作时,没有将连接字符串放到启动项目中。另外,如果启动项目中没有app.config,请添加app.config文件,然后向该配置文件添加连接字符串。
将ConnectionString添加到MVC Project web.config文件
我之所以这样做,是因为没有将项目设置为启动状态,如另一个答案所示。我对此的贡献-在执行添加迁移和更新数据库时,请将启动项目指定为nuget package manager控制台中的命令的一部分(不包括"["或"]"字符,这只是为了向您显示需要将位于该位置的文本更改为项目名称):
这应该可以做到。
定期迁移
这里有两个选项-这里每个人都建议的第一个选项是确保连接字符串在项目的web.config文件中。当使用来自Azure应用程序设置的连接字符串时,这意味着用Azure值覆盖web.config值。
Azure或自动迁移(编程)如果您以编程方式运行迁移,还有第二个选项可用,它允许您使用动态获取的连接字符串(或通过Azure应用程序设置)运行迁移,而不将其存储在web.config中:
设置配置的TargetDatabase时,请使用具有连接字符串和提供程序名称的dbConnectionInfo构造函数,而不是仅具有连接名称的构造函数。如果连接字符串没有提供程序名称,并且您正在使用SQL Server/Azure SQL,请使用"system.data.sqlclient"
我刚刚找到的解决这个问题的最佳方法是将该项目(很可能是类库)临时设置为启动项目。这将强制包管理器控制台使用该项目作为配置源。这种方式设置的部分原因是因为econfig文件通常遵循自顶向下的模型。经验法则是,最接近客户机的项目(例如,MVC应用程序)是将要使用的web.config或app.config。
包含.edmx文件的项目生成的连接字符串将生成连接字符串,这似乎是app.config中的一个保留,它对复制到输出目录并由可执行文件引用以存储运行时配置信息的文件进行了排序。
这在Web项目中中断,因为没有自动进程将随机的.config信息添加到Web项目的web.config文件中。
最简单的方法是将连接字符串从配置文件复制到web.config文件的connections部分,并忽略配置文件的内容。
当您在项目中使用层,并在数据层中定义或安装实体框架,并尝试运行项目时,就会发生此问题。
因此,为了克服这个问题,从存在EDMX文件的层复制连接字符串,并将连接字符串粘贴到main web.config中。
我在运行MSTEST时遇到了这个问题。没有"noisolation"的标志,我无法让它工作。
希望这能帮助别人。我花了很多时间才弄明白。从侧面看一切正常。在这个上下文中,实体框架有点奇怪。
在引用类库的"container"MVC项目的根web.config文件中添加连接字符串,如下所示:
1 2 3 4 5 | <connectionStrings> </connectionStrings> |
如果不想使用"myEntities"作为连接名,请根据需要更改它,但在myEntities dbContext类中进行以下更改:
1 2 3 4 | MyEntities: DbContext { public MyEntities():base("Name-Of-connection-string-you wish to connect"){ } } |
此错误的原因是,如果我们不在dbconext的派生类(在您的情况下是myEntities)中指定连接字符串或连接字符串的名称,那么dbconext将自动在根web.config文件中搜索与派生类名称相同的连接字符串(在您的情况下是my entities)。
这也可能导致调用代码中引用的dll引用不足。一个小笨蛋可以挽救你的一天。
我遵循DB-First方法,并在DAL类库项目中创建了EDMX文件,这引用了BAL类库,而BAL类库又被WCF服务引用。
由于我在BAL中得到了这个错误,我尝试了上述方法从DAL项目的app.config中复制配置详细信息,但没有解决。最后,在一个朋友的提示下,我将一个虚拟的EDMX文件添加到了WCF项目中(具有相关的DB连接等),因此它导入了所有必要的东西,然后我删除了EDMX文件,它只是用一个干净的构建解决了这个问题。
确保已将连接字符串放置在启动项目的根web.config中。
我知道我在这里说的有点明显,但我也遇到过这种情况——虽然我的MVC项目的web.config中已经有了连接字符串(该.edmx文件被放在一个不同的类库项目中),但我不明白为什么我一直得到一个异常…长话短说,我错误地将连接字符串复制到了viewsweb.config,这是一种奇怪的疲劳组合,不会滚动到解决方案资源管理器场景的底部。是的,这些事情也发生在经验丰富的开发人员身上:)
在web.config文件中添加connectoinstrong
1 | <ConnectionStiring> </ConnectionStiring> |