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