EF 创建另一个数据库而不是将迁移应用到现有数据库
EF creating another database instead of applying migrations to a existing one
我不明白为什么在我 运行 update-database
命令而不是将挂起的迁移应用到现有数据库时创建另一个数据库。这种情况似乎偶尔发生。这些是我在应用迁移时习惯的陡坡:
- 将包管理器项目设置为
MySolution.MyProject
;
- 运行
update-database
命令。它偶尔会使用我的上下文全 class 名称创建一个新数据库,例如:MySolution.MyProject.MyContext
;
- 在 SQL Server Management Studio 上,我删除了新创建的数据库
MySolution.MyProject.MyContext
;
- 运行 再次执行相同的命令
update-database
。然后,EF 正确找到我的数据库,名称为 only MyContext
并仅应用挂起的迁移。
最后一步是最初想要的结果。我想了解:为什么要创建另一个数据库? EF不应该在第运行处找出正确的名字吗?为什么我第二次运行时运行ning正确?我一定是做错了什么。
这是我的迁移项目,即MySolution.MyProject.MyContext
、app.config文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
...
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings>
<add name="MyContext" connectionString="Data Source=.\SQLDEV;Initial Catalog=MyContext;Persist Security Info=True;User ID=my_user;Password=my_password;Pooling=False;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
</entityFramework>
...
</configuration>
我为数据库用户授予了我机器上的所有权限(SQL 用户 > 服务器角色)。
这是我的文件 MyContext.cs:
namespace MySolution.MyProject
{
public class MyContext : DbContext
{
public MyContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
public MyContext(string nameOrConnectionString)
: base(nameOrConnectionString)
{
}
public MyContext(DbConnection existingConnection, bool contextOwnsConnection)
: base(existingConnection, contextOwnsConnection)
{
}
public MyContext(ObjectContext objectContext, bool dbContextOwnsObjectContext)
: base(objectContext, dbContextOwnsObjectContext)
{
}
// ... lots of stuff...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
base.OnModelCreating(modelBuilder);
}
}
}
如有任何关于我如何understand/debug/find 了解正在发生的事情的建议,我们将不胜感激。
正如@DrewJordan 所指出的,使用 -verbose
清楚地告诉我问题出在哪里。
由于我正在处理一个大型解决方案(几个项目),并且每个项目都有自己的 app.config(其中大部分没有 EF 连接),我检查了显示的详细信息:
PM> update-database -verbose
Using StartUp project 'MySolution.Business'.
Using NuGet project 'MySolution.MyProject'.
我没有在包管理器控制台中选择 Default Project
到 MySolution.MyProject
,而是 Set as StartUp Project
。然后它正常工作,因为它通过我的 EF 连接指向正确的 app.config。
我仍然不知道为什么第二个 运行 工作正常,但这似乎与我最终点击 MySolution.MyProject
并且当它变成粗体时启动项目有关正确设置为正确的 app.config 文件。
我不明白为什么在我 运行 update-database
命令而不是将挂起的迁移应用到现有数据库时创建另一个数据库。这种情况似乎偶尔发生。这些是我在应用迁移时习惯的陡坡:
- 将包管理器项目设置为
MySolution.MyProject
; - 运行
update-database
命令。它偶尔会使用我的上下文全 class 名称创建一个新数据库,例如:MySolution.MyProject.MyContext
; - 在 SQL Server Management Studio 上,我删除了新创建的数据库
MySolution.MyProject.MyContext
; - 运行 再次执行相同的命令
update-database
。然后,EF 正确找到我的数据库,名称为 onlyMyContext
并仅应用挂起的迁移。
最后一步是最初想要的结果。我想了解:为什么要创建另一个数据库? EF不应该在第运行处找出正确的名字吗?为什么我第二次运行时运行ning正确?我一定是做错了什么。
这是我的迁移项目,即MySolution.MyProject.MyContext
、app.config文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
...
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings>
<add name="MyContext" connectionString="Data Source=.\SQLDEV;Initial Catalog=MyContext;Persist Security Info=True;User ID=my_user;Password=my_password;Pooling=False;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
</entityFramework>
...
</configuration>
我为数据库用户授予了我机器上的所有权限(SQL 用户 > 服务器角色)。
这是我的文件 MyContext.cs:
namespace MySolution.MyProject
{
public class MyContext : DbContext
{
public MyContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
public MyContext(string nameOrConnectionString)
: base(nameOrConnectionString)
{
}
public MyContext(DbConnection existingConnection, bool contextOwnsConnection)
: base(existingConnection, contextOwnsConnection)
{
}
public MyContext(ObjectContext objectContext, bool dbContextOwnsObjectContext)
: base(objectContext, dbContextOwnsObjectContext)
{
}
// ... lots of stuff...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
base.OnModelCreating(modelBuilder);
}
}
}
如有任何关于我如何understand/debug/find 了解正在发生的事情的建议,我们将不胜感激。
正如@DrewJordan 所指出的,使用 -verbose
清楚地告诉我问题出在哪里。
由于我正在处理一个大型解决方案(几个项目),并且每个项目都有自己的 app.config(其中大部分没有 EF 连接),我检查了显示的详细信息:
PM> update-database -verbose
Using StartUp project 'MySolution.Business'.
Using NuGet project 'MySolution.MyProject'.
我没有在包管理器控制台中选择 Default Project
到 MySolution.MyProject
,而是 Set as StartUp Project
。然后它正常工作,因为它通过我的 EF 连接指向正确的 app.config。
我仍然不知道为什么第二个 运行 工作正常,但这似乎与我最终点击 MySolution.MyProject
并且当它变成粗体时启动项目有关正确设置为正确的 app.config 文件。