Поскольку 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 вращение.



