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

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

以上是关于实体框架查看错误的数据库的主要内容,如果未能解决你的问题,请参考以下文章

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

实体框架6不适用于Temporal表

无法查看实体 - 实体框架的数据模型

实体框架代码首先尝试打开错误的数据库

错误 3002:映射片段中的问题 | c# linq 到实体

仅实体框架代码错误:支持上下文的模型自创建数据库以来已更改