EF创建另一个数据库,而不是对现有数据库进行迁移



当我运行update-database命令而不是将挂起的迁移应用于现有数据库时,我不明白为什么要创建另一个数据库。这种情况似乎偶尔发生。这些是我在应用迁移时习惯的障碍:

  1. 将包管理器项目设置为MySolution.MyProject
  2. 运行update-database命令。它偶尔会用我的上下文完整类名创建一个新数据库,例如:MySolution.MyProject.MyContext
  3. 在SQLServerManagementStudio上,我删除了新创建的数据库MySolution.MyProject.MyContext
  4. 再次运行相同的命令update-database。然后,EF正确找到我的数据库,其名称为onlyMyContext,并仅应用挂起的迁移

最后一步是最初想要的结果。我想知道:为什么要创建另一个数据库?EF不应该在第一次跑步时找到正确的名字吗?为什么我第二次跑步时它运行正确?我一定是做错了什么事。

这是我的迁移项目,它是MySolution.MyProject.MyContextapp.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);
        }
    }
}

任何关于我如何理解/调试/发现正在发生的事情的建议都将不胜感激。

正如@DrewJordan所指出的,使用-verbose清楚地向我展示了问题所在。

由于我使用的是一个大型解决方案(几个项目),并且每个项目都有自己的app.config(其中大多数没有EF连接),我检查了verbose是否显示:

PM> update-database -verbose
Using StartUp project 'MySolution.Business'.
Using NuGet project 'MySolution.MyProject'.

我没有在包管理器控制台中选择Default ProjectMySolution.MyProject,而是选择了Set as StartUp Project。然后它工作正常,因为它指向了我的EF连接的正确的app.config

我仍然不知道为什么第二次运行效果良好,但这似乎与我最终单击MySolution.MyProject有关,当它变为粗体时,启动项目将正确设置为正确的app.config文件。

最新更新