Answers:
尝试将连接字符串复制到MVC项目中的.config文件。
没错,这是因为类库(.edmx文件所在的地方)不是您的启动/主项目。
您需要将连接字符串复制到主项目配置文件中。
如果您的启动/主项目没有配置文件(例如在我的控制台应用程序案例中),则只需添加一个(启动项目-添加新项->应用程序配置文件)。
可在此处找到更多相关信息: MetadataException:无法加载指定的元数据资源
确保您启动项目(使用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'
然后再试一次
Set as Startup Project
上面的屏幕截图相同的层。(即使您按了F5键,也无法启动类库)
您可以将连接字符串传递给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
或web.config
文件中StartUp
,如果在数据层项目中使用实体框架,请在主项目中安装实体框架nuget。
如果启动项目也发生改变的一个,它不具备连接字符串。
确保在以下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>
是的,这很愚蠢。您可以避免使用连接构建器来复制连接字符串。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配置是与.edmx文件在同一项目中的配置。
我也遇到过同样的问题。我从其他层执行数据访问操作时,错过了将连接字符串放入启动项目的过程。另外,如果您的启动项目中没有app.config,则添加app.config文件,然后向该配置文件添加连接字符串。
如另一个答案所示,我没有将项目设置为启动就得到了这一点。我对此的贡献-在执行Add-Migrations和Update-Database时,在Nuget Package Manager控制台中将启动项目指定为命令的一部分(不包括'['或']'字符,这只是为了向您显示需要将此处的文本更改为您的项目名称):
那应该做。
我刚刚发现解决此问题的最佳方法是将那个项目(很可能是一个类库)临时设置为启动项目。这将迫使程序包管理器控制台使用该项目作为其配置源。采用这种方式进行设置的部分原因是因为econfig文件通常遵循自上而下的模型。经验法则是,最接近客户端的项目(例如MVC应用程序)是将要使用的web.config或app.config。
当您在项目中使用图层并在DataLayer中定义或安装实体框架并尝试运行项目时,会发生此问题
因此,要解决此问题,请从Edmx文件所在的层复制连接字符串,然后将连接字符串粘贴到主web.config中。
在“容器” 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文件中搜索名称为的连接字符串。与派生类名相同(在您的情况下为“我的实体”)。
这里有两个选项-每个人都建议的第一个选项是确保连接字符串位于项目的Web.config文件中。使用来自Azure应用程序设置的连接字符串时,这意味着使用Azure值覆盖Web.config值。
如果您以编程方式运行迁移,则还有第二个选项,它允许您使用动态获取的连接字符串(或通过Azure应用程序设置)运行迁移,而无需将其存储在Web.config中:
设置配置的TargetDatabase时,请使用带有连接字符串和提供程序名称的DbConnectionInfo构造函数,而不要仅使用连接名称的构造函数。如果您的连接字符串没有提供程序名称,并且您正在使用SQL Server / Azure SQL,请使用“ System.Data.SqlClient”
@RyanMann 在最重要的答案上有一条评论建议:
将连接字符串存储在一个配置文件中,然后通过以下方式在其他项目中引用它们
<connectionString configSource="../ProjectDir/SharedConnections.config" />
这是一个很棒的建议!
它还可以在App.config和Web.config文件之间共享连接字符串!
任何想要遵循此建议的人,都应继续进行此SO回答。它在解决方案中的多个项目之间共享共享字符串方面,提供了非常好的分步指南。
唯一的警告是configSource
必须存在于同一目录或子目录中。上面的链接说明了如何使用“添加为链接”解决此问题。
如果使用的是MVVM模型,请尝试将连接字符串复制到项目的所有部分。
例如,如果您的解决方案包含两个项目,即类库项目和wpf项目,则必须复制后端项目的连接字符串(库类porject),然后将副本放置在wpf项目的App.config文件中。
<connectionStrings>
<add name="DBEntities" ... />
</connectionStrings>
希望对您有帮助:)
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).