实体框架查看错误的数据库
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架查看错误的数据库相关的知识,希望对你有一定的参考价值。
带有Repository的VS2013 Web API 2.x突然开始寻找在数据库实例上发生的数据迁移,而不是过去3个月以来的数据库实例--EF版本6
我有SQL Server 2012(v11.0.2218.0)作为ron-hplocaldb
- 这已经接受12次迁移使用add-migration / update-database命令3个月
截至昨天:去更新 - 数据库产生消息
PM> update-database -verbose
Using StartUp project 'PartyPoochesClient'.
Using NuGet project 'PartyPooches.Repository'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'PartyPooches.Repository.Entities.PartyPoochesContext' (***DataSource: (localdb)v12.0,*** Provider: System.Data.SqlClient, Origin: Convention).
我从未有过v12.0的实例,只有昨天的迁移/ update-database
尝试PM期望看到(localdb)v12.0
接受更新。任何代码搜索(localdb)v12.0
的整个解决方案都不会产生任何结果。正如预期的那样,它无法在SQL Server错误50中找到这样的实例,项目使用CodeFirst创建的数据库对ron-hplocaldb
实例有近12次迁移更新而没有问题。
代码:
internal sealed class Configuration : DbMigrationsConfiguration<PartyPooches.Repository.Entities.PartyPoochesContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
ContextKey = "PartyPooches.Repository.Entities.PartyPoochesContext";
}
protected override void Seed(PartyPooches.Repository.Entities.PartyPoochesContext context)
配置:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<parameter value="Data Source=ron-hplocaldb;Initial Catalog=PartyPooches.Repository.PartyPoochesContext; user=xxxxx;password=xxxxx; MultipleActiveResultSets=True;App=EntityFramework"/>
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
</providers>
</entityFramework>
DbContext
public class PartyPoochesContext : DbContext, IDisposable
{
public DbSet<Dog> Dogs { get; set; }
public DbSet<Handler> Handlers { get; set; }
public DbSet<Skill> Skills { get; set; }
public DbSet<DogType> DogTypes { get; set; }
public DbSet<Schedule> Schedules { get; set; }
public DbSet<Appointment> Appointments { get; set; }
public DbSet<PaymentType> PaymentTypes { get; set; }
public DbSet<Customer> Customers { get; set; }
上面的设置已经看到这个SQL Server 2012实例显示了3个月。
没有对设置进行任何更改,但是已经为次要数据库更新实现了最近的实体更改更改,该更新现在正在寻找不存在的SQL Server实例。到昨天为止3个月完美无瑕。无法找到任何与此相关的基于互联网的信息。像一些NuGet包这样的行为让一些东西掉了但不确定。
问题根源的关键在于:Origin: Convention
。实体框架的<parameter value="DataSource=..."
实际上并不是项目的数据库连接字符串。当应用程序创建新的ConnectionFactory
时,它是提供给应用程序的DbContext
的参数。但是,当应用程序运行时,实体框架外部的任何其他连接,或者当应用程序未运行时的实体框架本身(例如,迁移)期望web.config中的传统ConnectionString
密钥。
当您尝试执行update-database
并且不存在ConnectionString
值时,Entity Framework使用约定来决定要使用的连接字符串。此约定基于许多因素,包括PC上安装的软件版本。如果您的计算机上只安装了SQL LocalDb 2012(Visual Studio 2013早期版本的标准),则默认情况下实际的localdb路径为(localdb)v11.0
。这实际上将您的数据库存储在磁盘驱动器上的%localappdata%MicrosoftMicrosoft SQL Server Local DBInstancesv11.0
文件夹中。
如果您的计算机上的任何应用程序将您的系统更新为SQL LocalDb 2014,则约定将更改为(localdb)v12.0
,并假定新数据库将放入%localappdata%MicrosoftMicrosoft SQL Server Local DBInstancesv12.0
。
最终,你应该提供比DataSource
更完整的localdb
值,使用你想要使用的特定路径,(localDb)v11.0
。您还应该在web.config中提供<ConnectionString>
值以匹配您的Entity Framework <Parameters>
密钥,以确保始终保证在每个实例中都定位相同的数据库。
另请注意,您可以将DefaultConnectionFactory
键的名称传递给<ConnectionString>
的构造函数,而不是使用DbContext
。
以上是关于实体框架查看错误的数据库的主要内容,如果未能解决你的问题,请参考以下文章