Как удалить таблицу в 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");
}
}
И вы хотите отбросить этот стол. Возможно, вам потребуется выполнить следующие шаги:
- Удалить модель из dbcontext.
- Команда Run
dotnet ef migrations add RemoveSampleTable
(или любое название миграции). Но это будет генерировать только пустую миграцию.
public partial class RemoveSampleTable : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
}
protected override void Down(MigrationBuilder migrationBuilder)
{
}
}
- И если вы примените миграцию, выполнив команду типа
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);
});
}
}
- Теперь, если вы уже пробовали миграцию в своей базе данных, вам нужно удалить эту запись из __EFMigrationsHistory.
- Теперь приступим к выполнению команды
dotnet ef database update
и увидеть волшебство:P
Вы должны реализовать свой "IDatabaseInitializer" и создать собственную логику для выполнения этой операции. Например, пожалуйста, посетите этот
Также ознакомьтесь с разделом " Как использовать Entity Framework в режиме Code First Drop-Create?", Если это может помочь.
Исходя из собственного опыта, я сделал это, запустив приведенный ниже оператор из диспетчера консоли пакетов VS 2010
update-database -StartupProjectName "Your Project Namespace" -script -Verbose –force
Убедитесь, что в качестве проекта по умолчанию выбрано "Пространство имен вашего проекта".