2013-08-28 5 views
1

У меня есть приложение CMS Umbraco с некоторыми пользовательскими функциями, для которых я использую PetaPOCO для хранения данных в моей базе данных. Я создал ПОК и событие Umbraco, что пожары при запуске приложения, чтобы создать таблицу, если она не существует:Как изменить существующую таблицу базы данных (добавить/удалить столбцы) с помощью PetaPOCO (Umbraco 6, MVC)

public class RegisterEvents : ApplicationEventHandler 
{ 
    //This happens everytime the Umbraco Application starts 
    protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) 
    { 
     //Get the Umbraco Database context 
     var db = applicationContext.DatabaseContext.Database; 

     //Check if the DB table does NOT exist 
     if (!db.TableExist("MyTable")) 
     { 
      //Create DB table - and set overwrite to false 
      db.CreateTable<MyPetaPOCO>(false); 
     } 
    } 
} 

Как изменить существующую базу данных (я хочу, чтобы добавить столбец) без прямого доступа к база данных? Мне нужно использовать код, потому что хост еще не предоставляет доступа. Я думаю, что я должен быть в состоянии сделать это в этом событии переопределения ApplicationStarted, но я не знаю, как это сделать.

Редактировать

Должен ли я использовать somethingl Fluent Migrator

ответ

1

Если вы используете PetaPoco, вы могли бы использовать db.Execute("alter table ..."), но тогда вы должны иметь достаточные права доступа для выполнения DDL заявления подобного.

Также я буду запускать это в рамках транзакции PetaPoco, так как это хорошая практика.

И, наконец, если вы используете это приложение Application_Start (это нормально), вам необходимо выполнить проверку, чтобы убедиться, что столбец еще не существует.

+0

Digby, ничего себе, этот метод выполнения довольно хорош в документации PetaPOCO (всего несколько строк между другими, у которых гораздо больше документации). Спасибо, попробует ваше решение. Выпейте один из ваших собственных варевов за это, пожалуйста,), приветствия. –

2

Если это пакет или что-то, что вы развертываете (или потребляете другие), вам следует создать миграцию и запустить ее в вашем приложении ApplicationStarted.

https://cultiv.nl/blog/using-umbraco-migrations-to-deploy-changes/

Пример из приведенных выше статей:

Для того, чтобы добавить столбец к существующему PetaPOCO БД:

Создание класса миграции, производный от MigrationBase:

[Migration("1.0.1", 1, "YourTableName")] 
    public class AddNewColumnToTable : MigrationBase 
    { 
    public AddNewColumnToTable(ISqlSyntaxProvider sqlSyntax, ILogger logger) 
     : base(sqlSyntax, logger) 
    { } 

    public override void Up() 
    { 
     Alter.Table("YourTableName").AddColumn("ColumnToAdd").AsString().Nullable(); 
    } 

    public override void Down() 
    { 
     Delete.Column("ColumnToAdd").FromTable("YourTableName"); 
    } 
    } 

Обновить ApplicationStarted с логикой, чтобы запустить миграцию:

public class MyApplication : ApplicationEventHandler 
    { 
    protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) 
    { 
     HandleStatisticsMigration(); 
    } 

    private static void HandleStatisticsMigration() 
    { 
     const string productName = "YourTableName"; 
     var currentVersion = new SemVersion(0, 0, 0); 

     // get all migrations for "YourTableName" already executed 
     var migrations = ApplicationContext.Current.Services.MigrationEntryService.GetAll(productName); 

    // get the latest migration for "YourTableName" executed 
    var latestMigration = migrations.OrderByDescending(x => x.Version).FirstOrDefault(); 

    if (latestMigration != null) 
     currentVersion = latestMigration.Version; 

    var targetVersion = new SemVersion(1, 0, 1); 
    if (targetVersion == currentVersion) 
     return; 

    var migrationsRunner = new MigrationRunner(
     ApplicationContext.Current.Services.MigrationEntryService, 
     ApplicationContext.Current.ProfilingLogger.Logger, 
     currentVersion, 
     targetVersion, 
     productName); 

    try 
    { 
     migrationsRunner.Execute(UmbracoContext.Current.Application.DatabaseContext.Database); 
    } 
    catch (Exception e) 
    { 
     LogHelper.Error<MyApplication>("Error running YourTableName migration", e); 
    } 
    } 
} 

Обратите внимание, что целевая версия должна соответствовать версии вы установили в атрибуте Migration класса (в данном примере, 1.0.1)

Как сделать обновления и добавьте новые функции в свое приложение или плагин, создайте новые миграции (при необходимости) и обновите целевую версию.