实体框架查看错误的数据库

时间:2015-05-17 05:42:04

标签: entity-framework asp.net-web-api sql-server-2012 ef-migrations

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包这样的行为让一些东西掉了但不确定。

1 个答案:

答案 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