使用 OrmLite 时,有哪些推荐的管理生产部署的模式?

What are some recommended patterns for managing production deployments when using OrmLite?

我们目前正在将 ServiceStack 与 Entity Framework 一起使用,并且正在研究迁移到 ServiceStack.OrmLite。

我们主要关心的一个问题是如何最好地管理生产部署。

我们使用 AppVeyor/Octopus 进行持续部署。通过纯代码优先的 EF,我们可以使用迁移。通过数据库优先的方法,我们使用了数据库项目、SSDT 和 MsDeploy 或 DbUp 等工具。但是对于 OrmLite,我们不确定最流畅的设置是分别处理对我们的测试、暂存和生产数据库的部署。我们应该代码优先并推出我们自己的迁移逻辑吗?我们应该先使用 DB 并使用 T4 模板生成 POCO 吗?

我很想听听在持续部署设置中有效使用 OrmLite 的人的一些成功故事。

虽然这是一种粗略的方法,但我最近处理模式迁移的方式是将所有迁移保存在我手动 运行 部署之前的测试装置中,它只使用 OrmLite 执行自定义 SQL DDL 语句修改 table 模式或填充任何 table 数据。

要在环境之间切换,我只是取消注释我想要 运行 的环境,例如这是我的 DatabaseMigrations 测试 class 的示例:

[TestFixture, Explicit]
public class DatabaseMigrations
{
    IDbConnectionFactory LocalDbFactory = ...;
    IDbConnectionFactory TestDbFactory = ...;
    IDbConnectionFactory LiveDbFactory = ...;

    private IDbConnection Db;

    public DatabaseMigrations()
    {
        //DbFactory = LocalDbFactory;
        //DbFactory = TestDbFactory;
        DbFactory = LiveDbFactory;
        Db = DbFactory.Open();
    }

    //...

    [Test]
    public void Add_ExternalRef_to_Subscription()
    {
        Db.ExecuteNonQuery("ALTER TABLE subscription ADD COLUMN external_ref text");

        var subIds = Db.Column<int>(Db.From<Subscription>().Where(
            x => x.ExternalRef == null).Select(x => x.Id));

        foreach (var subId in subIds)
        {
            Db.UpdateOnly(new Subscription { 
                    ExternalRef = Guid.NewGuid().ToString("N") 
                },
                where: x => x.Id == subId,
                onlyFields: x => new { x.ExternalRef });
        }
    }
}

它不支持回滚,但它可以快速轻松地创建并在源代码管理中按顺序保持所有模式更改,并且 运行在代码中可用。

带有自定义迁移的定制解决方案Table

我之前成功使用的其他自定义迁移解决方案涉及在 RDBMS 中维护自定义 table 的定制解决方案,例如Migrations 其中包含已在该数据库上 运行 的所有迁移的列表。 CI 任务会将数据库中的行与本地文件夹中的文件进行比较,例如:

/Migrations
    01_Add_ExternalRef_to_Subscription.sql       

并自动 运行 任何缺少的自定义 sql 迁移脚本。这种方法在保持 RDBMS table 与迁移脚本同步方面做得很好,其中每个数据库上的迁移状态 运行 都保存在数据库本身中。

此解决方案的主要缺点是迁移保存在自定义 .sql 文件中,缺乏适当编程语言的灵活性。

最优解

我认为理想的解决方案是结合这些方法,即自定义数据库迁移 Table 而不是 运行 宁 C# 数据库迁移 NUnit 测试。数据库连接设置也需要移出到外部配置中,并可能包括用于回滚模式迁移的解决方案(例如以“_Rollback”结尾的测试),尽管我需要回滚的次数很少,但手动操作的工作量更少在需要时回滚,然后必须为已完成的每个模式更改维护回滚脚本。