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

问题描述 投票:0回答:5

嘿,我刚刚开始使用 EF core,一切正常。我调用

context.Database.Migrate()
方法,它会创建一个数据库。但即使我的上下文对象有一个
DBSet<T>
,除了迁移历史记录之外,它不会创建任何表。

有人可以帮我解决这个问题吗?

c# sql-server asp.net-core entity-framework-core
5个回答
28
投票

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

对于每个数据库更改,您应该调用

Add-Migration {sensibleName}

您的启动类将继续调用

context.Database.Migrate()
,它将检查您的数据库并处理任何未完成的迁移。

例如,创建数据库后,一般规则是调用

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

如果随后调用

Add-Migration SmallChange
,下次启动时也会发生同样的情况,类似于以下内容:

  1. 数据库是否存在?是的
  2. 是否已经申请了初始移民?是的
  3. 是否已应用迁移SmallChange?不
  4. 应用迁移 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


12
投票

所以我为此奋斗了很长时间,但我无法弄清楚。我的迁移位于应用程序项目中,而我的 DbContext 位于另一个项目中。

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

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

4
投票

我做了以下工作并且有效:

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

4
投票

我会补充标记为正确的答案。就我而言,迁移不起作用,尽管一切都如上面的答案所示。 EF 工具更新帮助了我:

dotnet tool update --global dotnet-ef


0
投票

如果您没有数据库,也没有创建任何迁移(项目中没有

Migrations
文件夹),则调用
Migrate
将创建不带任何表的数据库。

如果您还想创建表,请在调用

EnsureCreated
之前调用
Migrate

context.Database.EnsureCreated()
context.Database.Migrate()

前者将创建数据库表,而后者将应用任何挂起的迁移。

© www.soinside.com 2019 - 2024. All rights reserved.