VS2013带有Repository的WebAPI 2.x突然开始寻找在数据库实例上发生的数据迁移,而不是过去3个月以来的数据库实例--EF版本6
我将SQL Server 2012(v11.0.2218.0)作为ron-hp\localdb
- 这已经接受了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-hp\localdb
实例的迁移更新几乎没有问题。
代码:
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-hp\localdb;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包这样的行为让一些东西掉了但不确定。
答案 0 :(得分:5)
问题根源的关键在于:Origin: Convention
。实体框架的<parameter value="DataSource=..."
实际上不是项目的数据库连接字符串。当应用创建新的ConnectionFactory
时,它是应用程序DbContext
提供的参数。但是,当应用程序运行时,Entity Framework之外的任何其他连接,或者当应用程序未运行时的Entity Framework本身(例如,迁移)期望web.config中的传统ConnectionString
密钥。
当您尝试执行update-database
并且没有ConnectionString
值时,实体框架使用约定来决定要使用的连接字符串。此约定基于许多因素,包括PC上安装的软件版本。如果您的计算机上只安装了SQL LocalDb 2012(Visual Studio 2013早期版本的标准),则默认情况下实际的localdb路径为(localdb)\v11.0
。这实际上将您的数据库存储在磁盘驱动器上的文件夹%localappdata%\Microsoft\Microsoft SQL Server Local DB\Instances\v11.0
中。
如果计算机上的 任何 应用程序将您的系统更新为SQL LocalDb 2014,则约定将更改为(localdb)\v12.0
,并假定将新数据库放入%localappdata%\Microsoft\Microsoft SQL Server Local DB\Instances\v12.0
。
最终,您应使用您希望使用的特定路径DataSource
提供比localdb
更完整的(localDb)\v11.0
值。您还应该在web.config中提供<ConnectionString>
值以匹配您的实体框架<Parameters>
密钥,以确保始终保证在每个实例中都定位相同的数据库。
另请注意,您可以将DefaultConnectionFactory
密钥的名称传递给<ConnectionString>
的构造函数,而不是使用DbContext
。