gpt4 book ai didi

c# - 如何使用 PetaPOCO(Umbraco 6、MVC)修改现有数据库表(添加/删除列)

转载 作者:太空宇宙 更新时间:2023-11-03 18:33:48 26 4
gpt4 key购买 nike

我有一个带有一些自定义功能的 Umbraco CMS 应用程序,为此我使用 PetaPOCO 将数据存储在我的数据库中。我创建了我的 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

最佳答案

如果这是一个包或您正在部署(或让其他人使用)的东西,您应该创建一个迁移并在您的 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)

当您对应用程序或插件进行更新和添加新功能时,您会创建新的迁移(如果需要),并更新您的目标版本。

关于c# - 如何使用 PetaPOCO(Umbraco 6、MVC)修改现有数据库表(添加/删除列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18483015/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com