Статьи

Поддержка NuoDB для первых миграций кода Entity Framework

Поскольку 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

Давайте начнем с упрощенной модели 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командлета, где я буду использовать поставляемые значения по умолчанию. Этот шаг создаст новую папку в проекте с файлом конфигурации внутри.

Enable-Migrations.png

Затем я добавляю первую миграцию, используя 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");
    }
}

Первое Migration.png

Это похоже на код 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')

Update-Database.png

Это довольно типичный сценарий 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 вращение.