2

私は、PetaPOCO を使用してデータベースにデータを保存するカスタム機能を備えた Umbraco CMS アプリケーションを持っています。POCO と、テーブルが存在しない場合にアプリケーションの起動時に起動してテーブルを作成する Umbraco イベントを作成しました。

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 オーバーライド イベントでこれを実行できるはずですが、方法がわかりません。

編集

何かFluent Migratorを使用する必要がありますか

4

2 に答える 2

7

これがパッケージまたは展開する (または他のユーザーに使用させる) ものである場合は、移行を作成し、ApplicationStarted メソッドで実行する必要があります。

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

上記の記事の例:

既存の PetaPOCO DB に列を追加するには:

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);
     }
   }
 }

ターゲット バージョンは、Migrationclass 属性で設定したバージョン (この例では 1.0.1)と一致する必要があることに注意してください。

アプリケーションまたはプラグインに更新を行って新しい機能を追加すると、(必要に応じて) 新しい移行を作成し、ターゲット バージョンを更新します。

于 2016-09-13T17:23:12.817 に答える
2

PetaPoco を使用している場合は、 を使用できますが、db.Execute("alter table ...")そのような DDL ステートメントを実行するには十分なアクセス権が必要です。

また、PetaPoco トランザクション内でもこれを実行することをお勧めします。

最後に、これを Application_Start で実行していた場合 (これは問題ありません)、列がまだ存在していないことを確認するためにチェックを実行する必要があります。

于 2013-08-28T10:06:41.707 に答える