如何在Entity Framework Code First中删除表?

时间:2013-10-19 23:46:00

标签: c# entity-framework ef-code-first database-migration ef-migrations

我正在使用Entity Framework和Auto Migrations。

因此,当我向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 个答案:

答案 0 :(得分:2)

add-migrations命令可创建“迁移”文件夹。你可以看到包含两种方法的[DateStamp] _InitialCreate.cs文件。上和下。 InitialCreate类的Up方法创建与数据模型实体集对应的数据库表,Down方法删除它们。通常,当您输入命令以回滚数据库时,将调用Down方法。您可以在Down方法中看到DropIndex,DropForeignKey,DropTable语句等语句。

如果Emre提出问题,请在[DateStamp] _InitialCreate.cs类的Down方法中编写DropTable语句,该表将被删除。

希望它会有所帮助。

答案 1 :(得分:1)

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

另请注意“How do I use Entity Framework in Code First Drop-Create mode?”是否可以提供帮助。

根据我自己的经验,我是通过从VS 2010的Package console manager运行以下语句来完成的。

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

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

答案 2 :(得分:1)

AutomaticMigrationDataLossAllowed = true;添加到Configuration类,它将自动删除表。

答案 3 :(得分:0)

我也有类似的问题。 假设您的初始迁移创建了一个名为“ 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