EF核心不在迁移方法上创建表

Posted

技术标签:

【中文标题】EF核心不在迁移方法上创建表【英文标题】:EF core not creating tables on migrate method 【发布时间】:2018-10-30 09:44:09 【问题描述】:

嘿,我刚开始使用 EF 核心,一切正常。我调用了context.Database.Migrate() 方法,它创建了一个数据库。但即使我的上下文对象有一个DBSet<T>,它也不会创建任何表,除了迁移历史记录。

谁能帮我解决这个问题?

【问题讨论】:

你给Add-Migration打过电话吗? 是的,我做到了。但我仍然希望 db 由代码本身启动.. Add-Migration 生成代码,context.Database.Migrate() 使用该代码迁移它。 好的。但它仍然无法正常工作。在这两种情况下,它只是创建数据库。不是表格 【参考方案1】:

context.Database.Migrate() 本身不会生成迁移。相反,它会处理您创建的迁移。

对于每个数据库更改,您应该致电Add-Migration sensibleName

您的启动类将继续调用context.Database.Migrate(),它将检查您的数据库并处理任何未完成的迁移。

例如,一旦您创建了数据库,一般规则是调用Add-Migration Initial。调用context.Database.Migrate() 一次将检查您的数据库是否存在,如果不存在则创建它,检查是否应用了Initial 迁移,如果没有则应用它。

如果你随后调用Add-Migration SmallChange,下次启动时也会发生同样的情况,类似于以下内容:

    数据库是否存在?是的 是否已应用迁移初始值?是的 是否已应用迁移 SmallChange?没有 应用迁移 SmallChange

您的第一次迁移应该如下所示:

public partial class Initial : Migration

    protected override void Up(MigrationBuilder migrationBuilder)
    
        migrationBuilder.CreateTable(
            name: "HelloWorld",
            columns: table => new
            
                Id = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                MyString = table.Column<string>(nullable: true),
            );
    

如果您的迁移看起来不是这样,则可能是您的 DbContext 配置不正确。如果您的表仍未被应用,请尝试从您的包管理器控制台运行数据库更新,看看 Update-Database -Verbose 到底发生了什么

【讨论】:

明白。但这就是我的观点。我创建了初始迁移。但是我的Up()Down() 方法是空的,没有生成表。 好的 - 在 SQL Server Management Studio(或您使用的任何工具)中,删除已创建的数据库。清除您的 Migrations 文件夹,然后再次尝试 Add-Migration Initial 所以现在它起作用了。如果我稍后在阶段添加 DBSet 会怎样。我是否必须再次执行上述步骤(命令行调用 Update-Database)。有没有办法在 C# 中做到这一点? 不,您代码中的 context.Database.Migrate() 方法与 Update-Database 同义 ? 现在您已经进行了初始迁移,对您的 DbContext(或其中的模型)的任何更改都会创建一个差异迁移。我建议您现在试一试,更改型号并致电Add-Migration 看看会发生什么。 TLDR Add-Migration 始终是必需的,您的 c.Db.Migrate() 呼叫将应用它们! EF 核心中是否有类似自动迁移的功能?【参考方案2】:

所以我与这个斗争了很长时间,但我无法弄清楚。我的迁移在应用程序项目中,而我的 DbContext 在另一个项目中。

在为要应用迁移的上下文创建选项时,需要指定 MigrationAssembly。

serviceCollection.AddDbContext<YourContext>(options => options.UseSqlServer(_configuration.GetConnectionString("ConnectionString"), b => b.MigrationsAssembly("Your.Assembly")));

【讨论】:

非常感谢。很好的答案。 经过一整天的斗争,这最终成为了我的答案!【参考方案3】:

我做了以下工作:

    擦除我的 APP 项目中的迁移文件夹。 站在 DataAccess 项目上,在那里我声明了持久性(EF、Dbcontext 等) 2.1 添加-迁移初始。 2.2 从控制台更新数据库。

【讨论】:

【参考方案4】:

我将补充标记为正确的答案。就我而言,迁移不起作用,尽管一切都与上面的答案一样。 EF 工具更新帮助了我:dotnet tool update --global dotnet-ef

【讨论】:

仅供参考,对现有答案的补充应添加为 cmets 而不是新答案。 我知道,但我没有足够的声誉

以上是关于EF核心不在迁移方法上创建表的主要内容,如果未能解决你的问题,请参考以下文章

实体框架手动删除的表不能从EF迁移生成

EF-Core:表“名称”已经存在 - 尝试更新数据库时

代码第一个约定不在实体框架6.2中的多对多关系上创建连接表

EF Core 迁移从其他上下文添加表

内存优化表(EF 核心 5)不支持保存点

使用 EF 迁移历史表中的二进制数据恢复 mysqldump