entity framework 查看了错误的数据库

entity framework looking at wrong database

VS2013 WebAPI 2.x with Repository 突然开始寻找数据库实例上发生的数据迁移,而不是过去 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 服务器错误 50 的此类实例,该项目使用 CodeFirst 创建的数据库几乎有 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)

配置:

<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 服务器的不存在实例。完美无瑕 3 个月,直到昨天。无法找到处理此问题的任何基于 Internet 的信息。就像某些 NuGet 程序包漏掉了一些东西但不确定那样。

问题根源的关键在这里:Origin: Convention。 Entity Framework 的 <parameter value="DataSource=..." 实际上不是项目的数据库连接字符串。它是应用程序创建新 DbContext 时提供给应用程序 ConnectionFactory 的参数。但是,当应用程序是 运行 时 Entity Framework 之外的任何其他连接,或者当应用程序不是 运行 时 Entity Framework 本身(例如,迁移)期望传统的 ConnectionString 键入 web.config.

当您尝试执行 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.

最终,您应该提供比 localdb 更完整的 DataSource 值,使用您希望使用的特定路径 (localDb)\v11.0。您还应该在 web.config 中提供一个 <ConnectionString> 值以匹配您的 Entity Framework <Parameters> 键,以确保您始终保证在每个实例中都以相同的数据库为目标。

另请注意,您可以将 <ConnectionString> 键的名称传递给 DbContext.

的构造函数,而不是使用 DefaultConnectionFactory