8

我正在使用带有自动迁移的实体框架。

因此,当我向 Context 添加新模型时,我的数据库会更新并创建新表。

我想做的恰恰相反,将表完全从数据库中删除。但是,从 Context 类中删除定义不起作用。

public class CompanyContext : DbContext
{
    public DbSet<Permission> Permissions { get; set; }
    public DbSet<Company> Companies { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
       base.OnModelCreating(modelBuilder);
    }
}

例如,我想Company从数据库中删除表。为此,我从类中删除Companies了属性。CompanyContext但是,它不起作用。

如果可能,在 EF 中删除表并使用自动迁移的正确方法是什么?

4

4 回答 4

2

The add-migrations command creates a Migrations folder. You can see [DateStamp]_InitialCreate.cs file containing two methods viz.; Up and Down. The Up method of the InitialCreate class creates the database tables that corresponds to the data model entity sets, and the Down method delete them. Typically when you enter a command to rollback a database, Down method is called. You can see statements like DropIndex, DropForeignKey, DropTable statements in Down method.

In case of question asked by Emre, write the DropTable statement in the Down method of [DateStamp]_InitialCreate.cs class and the table will be dropped.

Hopefully it will help.

于 2014-04-21T12:20:04.373 回答
1

添加AutomaticMigrationDataLossAllowed = true;到配置类,它会自动删除表。

于 2014-04-21T11:46:37.860 回答
1

您应该实现“IDatabaseInitializer”并创建自定义逻辑来执行此操作。例如,请访问

另请参阅“如何在 Code First Drop-Create 模式下使用实体框架? ”如果它可以提供帮助。

以我自己的经验,我是通过从 VS 2010 的包控制台管理器中运行以下语句来完成的

update-database -StartupProjectName "Your Project Namespace" -script -Verbose –force

确保您已选择“您的项目命名空间”作为默认项目。

于 2013-10-20T01:39:36.080 回答
1

我也有类似的问题。假设您的初始迁移创建了一个名为“SampleTable”的表

    public partial class InitialCreate : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "SampleTable",
                columns: table => new
                {
                    ...
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_SampleTable", x => x.Id);
                });       
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "SampleTable");
        }
    }

你想删除那张桌子。您可能需要遵循的步骤是

  1. dbcontext中删除模型。
  2. 运行命令dotnet ef migrations add RemoveSampleTable(或迁移的任何名称)。但它只会产生空迁移。
    public partial class RemoveSampleTable : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
        }
    }
  1. 如果您通过执行类似的命令来应用迁移dotnet ef database update。它基本上什么都不做。所以这里的技巧是从早期迁移中复制 Up/Down 的内容并将其粘贴到相反的方法。
    public partial class RemoveSampleTable : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "VesselBuildingProject");
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
                    migrationBuilder.CreateTable(
                        name: "SampleTable",
                        columns: table => new
                        {
                            ...
                        },
                        constraints: table =>
                        {
                            table.PrimaryKey("PK_SampleTable", x => x.Id);
                        });
        }
    }
  1. 现在,如果您现在已经在您的数据库上尝试过迁移,您需要从__EFMigrationsHistory中删除该条目。
  2. 现在继续执行命令dotnet ef database update,看看魔法:P
于 2020-09-23T12:26:23.467 回答