EF创建另一个数据库,而不是将迁移应用于现有数据库

时间:2015-02-09 13:28:36

标签: c# entity-framework ef-migrations

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

  1. 将包管理器项目设置为MySolution.MyProject;
  2. 运行update-database命令。它偶尔使用我的上下文完整类名创建一个新数据库,例如:MySolution.MyProject.MyContext;
  3. 在SQL Server Management Studio上,我删除了新创建的数据库MySolution.MyProject.MyContext;
  4. 再次运行相同的命令update-database。然后,EF正确查找我的数据库,该名称仅 MyContext并仅应用待处理的迁移。
  5. 最后一步是首先想要的结果。我想了解:为什么要创建另一个数据库? EF第一次运行时不应该找到正确的名字吗?我第二次跑时为什么运行正常?我一定是做错了。

    以下是我的迁移项目,即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用户&gt;服务器角色)。

    这是我的文件 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);
            }
        }
    }
    

    对于我如何理解/调试/了解正在发生的事情的任何建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

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

由于我正在使用大型解决方案(几个项目),并且每个项目都有自己的app.config(大多数没有EF连接),我检查了显示的详细信息:

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的事实有关,当它变为粗体时,启动项目将正确设置为正确的应用程序.config文件。