Поскольку Entity Framework упрощает работу с данными — и я имею в виду базовые операции, такие как запросы и обновление, — конечно же, существует потребность в упрощении других частей жизни разработчика приложений. Данные должны храниться где-то. Где-то в базе данных со структурой, которая предпочтительно соответствует вашей модели и классам Entity Framework!
Code First Migrations — это часть Entity Framework, которая упрощает управление структурой базы данных по мере развития приложения с течением времени. Вам не нужно иметь дело с командами DDL и т. Д .; вы просто позволяете логике обновить вашу базу данных до текущего состояния модели. И, конечно, вы можете изменить результат до его применения и даже добавлять элементы по своему усмотрению, например, индексы.
(В следующем примере я опишу простой пример работы с миграциями. Посетите MSDN, если вам нужна помощь для начала работы с Entity Framework.)
Если вы устанавливаете (или обновляете) только что выпущенный драйвер Entity Framework для NuoDB из NuGet, вызывая Tools | NuGet Package Manager | Консоль диспетчера пакетов и введя команду, Install-Package EntityFramework.NuoDb
вы будете готовы к работе.
Давайте начнем с упрощенной модели Entity Framework, похожей на пример «Хоккей»:
class HockeyContext : DbContext { public HockeyContext() : base(new NuoDbConnection(Config.ConnectionString), true) { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.HasDefaultSchema("migrations"); var playerConf = modelBuilder.Entity<[Player]>(); playerConf.ToTable("PLAYERS"); } public DbSet<[Player]> Players { get; set; } } class Player { public string PlayerId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
Следующий шаг — включить миграцию с помощью Enable-Migrations
командлета, где я буду использовать поставляемые значения по умолчанию. Этот шаг создаст новую папку в проекте с файлом конфигурации внутри.
Затем я добавляю первую миграцию, используя Add-Migration Initial
(в данном случае, имя «Initial»). Это создает класс с тем же именем, фиксируя текущее состояние модели:
public partial class Initial : DbMigration { public override void Up() { CreateTable( "migrations.PLAYERS", c => new { PlayerId = c.String(nullable: false, maxLength: 128, unicode: false), FirstName = c.String(unicode: false), LastName = c.String(unicode: false), }) .PrimaryKey(t => t.PlayerId); } public override void Down() { DropTable("migrations.PLAYERS"); } }
Это похоже на код C #, но не предназначено для выполнения; это только помогает захватить шаги миграции, которые будут переведены в SQL для использования NuoDB Update-Database -Script
. Это откроет новый документ, содержащий SQL, который должен быть выполнен в базе данных, чтобы настроить таблицы, соответствующие нашей модели данных:
CREATE TABLE "migrations"."PLAYERS" ( "PlayerId" VARCHAR(128) NOT NULL, "FirstName" VARCHAR(32765), "LastName" VARCHAR(32765) ) ; ALTER TABLE "migrations"."PLAYERS" ADD CONSTRAINT "PK_migrations_PLAYERS" PRIMARY KEY ("PlayerId") ; CREATE TABLE "migrations"."__MigrationHistory" ( "MigrationId" VARCHAR(150) NOT NULL, "ContextKey" VARCHAR(300) NOT NULL, "Model" BLOB NOT NULL, "ProductVersion" VARCHAR(32) NOT NULL ) ; ALTER TABLE "migrations"."__MigrationHistory" ADD CONSTRAINT "PK_migrations___MigrationHistory" PRIMARY KEY ("MigrationId", "ContextKey") ; INSERT INTO "migrations"."__MigrationHistory"("MigrationId", "ContextKey", "Model", "ProductVersion") VALUES ('201409211350349_Initial', 'NuoDbMigrationsTest.Migrations.Configuration', 0x1F8B0...0D0000, '6.1.1-30610')
Это довольно типичный сценарий SQL, основанный на нашей простой модели. Вы также можете заставить каркас применить изменения от вашего имени, удалив -Script
опцию и просто вызвав ее Update-Database
.
Давайте добавим новый столбец и проиндексируем его, используя CreateIndex
:
public partial class Index : DbMigration { public override void Up() { AddColumn("migrations.PLAYERS", "Snafu", c => c.Int(nullable: false)); CreateIndex("migrations.PLAYERS", "Snafu", unique: false, name: "IDX_PLAYERS_Snafu"); } public override void Down() { DropColumn("migrations.PLAYERS", "Snafu"); } }
Вот результирующий скрипт:
ALTER TABLE "migrations"."PLAYERS" ADD "Snafu" INT NOT NULL DEFAULT 0; CREATE INDEX "IDX_PLAYERS_Snafu" ON "migrations"."PLAYERS"("Snafu"); INSERT INTO "migrations"."__MigrationHistory"("MigrationId", "ContextKey", "Model", "ProductVersion") VALUES ('201409211407156_Index', 'NuoDbMigrationsTest.Migrations.Configuration', 0x1F8B0800...8730F0000, '6.1.1-30610');
Волшебство за этим заключается в классе «NuoDbMigrationSqlGenerator». Вы можете получить свой собственный, если хотите, чтобы изменить сгенерированный SQL. Вам необходимо указать Entity Framework в производном классе «DbConfiguration», чтобы использовать его с помощью метода «SetMigrationSqlGenerator».
Легко, правда? Я надеюсь, вам понравится эта новая глава Code First Migrations в истории Entity Framework. Дайте NuoDB и Entity Framework вращение.