ron*_*dan 2 entity-framework sql-server-2012 ef-migrations asp.net-web-api
带有Repository的VS2013 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).
Run Code Online (Sandbox Code Playgroud)
我从未有过v12.0的实例,只有昨天的迁移/ update-database尝试PM期望看到a (localdb)\v12.0接受更新.任何代码搜索整个解决方案,(localdb)\v12.0什么都不产生.正如预期的那样,它无法在SQL Server错误50中找到这样的实例,项目使用CodeFirst创建的DB几乎有12个迁移更新到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)
Run Code Online (Sandbox Code Playgroud)
配置:
<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>
Run Code Online (Sandbox Code Playgroud)
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; }
Run Code Online (Sandbox Code Playgroud)
上面的设置已经看到这个SQL Server 2012实例显示了3个月.
没有对设置进行任何更改,但是已经为次要数据库更新实现了最近的实体更改更改,该更新现在正在寻找不存在的SQL Server实例.到昨天为止3个月完美无瑕.无法找到任何与此相关的基于互联网的信息.像一些NuGet包这样的行为让一些东西掉了但不确定.
问题根源的关键在于: Origin: Convention.在<parameter value="DataSource=..."对实体框架实际上不是该项目的数据库连接字符串.它是应用ConnectionFactory程序创建新应用程序时提供给应用程序的参数DbContext.但是,当应用程序运行时,Entity Framework之外的任何其他连接,或者当应用程序未运行时的Entity Framework本身(例如,迁移)期望ConnectionStringweb.config中的传统密钥.
当您尝试执行a update-database并且没有ConnectionString值存在时,Entity Framework使用约定来决定要使用的连接字符串.此约定基于许多因素,包括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.您还应该<ConnectionString>在web.config中提供一个值以匹配您的Entity Framework <Parameters>键,以确保始终保证在每个实例中都以相同的数据库为目标.
另请注意,DefaultConnectionFactory您可以将<ConnectionString>密钥的名称传递给您的构造函数,而不是使用DbContext.
| 归档时间: |
|
| 查看次数: |
2880 次 |
| 最近记录: |