Как удалить таблицу в Entity Framework Code First?

Я использую Entity Framework с автоматической миграцией.

Поэтому, когда я добавляю новую модель в свой контекст, моя база данных обновляется и создается новая таблица.

То, что я хочу сделать, - это наоборот: полностью удалить таблицу из базы данных. Однако удаление определения из класса 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 и, если возможно, использовать автоматическую миграцию?

3 ответа

Добавлять AutomaticMigrationDataLossAllowed = true; к классу конфигурации, и он будет автоматически отбрасывать таблицы.

Команда add-migrations создает папку Migrations. Вы можете увидеть файл [DateStamp]_InitialCreate.cs, содержащий два метода, а именно; Вверх и вниз. Метод Up класса InitialCreate создает таблицы базы данных, соответствующие наборам сущностей модели данных, а метод Down их удаляет. Обычно, когда вы вводите команду для отката базы данных, вызывается метод Down. Вы можете увидеть операторы типа DropIndex, DropForeignKey, DropTable в методе Down.

В случае вопроса, заданного Эмре, напишите оператор DropTable в методе Down класса [DateStamp]_InitialCreate.cs, и таблица будет удалена.

Надеюсь, это поможет.

У меня тоже была аналогичная проблема. Предположим, ваша первоначальная миграция создает таблицу с именем 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. Команда Run 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

Вы должны реализовать свой "IDatabaseInitializer" и создать собственную логику для выполнения этой операции. Например, пожалуйста, посетите этот

Также ознакомьтесь с разделом " Как использовать Entity Framework в режиме Code First Drop-Create?", Если это может помочь.

Исходя из собственного опыта, я сделал это, запустив приведенный ниже оператор из диспетчера консоли пакетов VS 2010

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

Убедитесь, что в качестве проекта по умолчанию выбрано "Пространство имен вашего проекта".