gpt4 book ai didi

entity-framework - DevExpress XPO 与 NHibernate 与 Entity Framework : database upgrading issue

转载 作者:行者123 更新时间:2023-12-04 08:29:46 27 4
gpt4 key购买 nike

使用 ORM(DevExpress XPONHibernateMS Entity Framework)升级数据库的最佳实践是什么?

我正在开始一个新项目,必须选择一个 ORM。开发过程需要经常发布中间测试版本,并且每个版本都可能在数据库结构中发生变化。每个新版本都必须轻轻升级数据库以保留当前数据。

对于旧解决方案,我将提供一组 SQL 脚本,用于将数据库从 v1 升级到 v2、从 v2 升级到 v3 等,并按顺序执行它们。

但它如何为 ORM 工作?我还应该编写 SQL 脚本来升级数据库吗?

我知道简单地添加新字段不会导致问题(例如,参见 XPO 的 UpdateSchema() method),但是如果我必须拆分表并将当前记录重新分配到 2 个新表中怎么办?

最佳答案

我无法评论其他 ORM,但自 2007 年以来,我一直将 DevExpress XPO 用于企业财务应用程序。架构随着每个版本的发布而略有变化,但多年来也发生了一些重大的架构变化。默认 XPO 升级机制的某种扩展版本已轻松满足所有更改。

有很好的基础资料here关于升级 XPO 应用程序。

  • DevExpress 提供了一个 DBUpdater 工具来帮助您完成升级生产环境的任务。您可以扩展此工具以满足其他要求。在我的应用程序中,我们添加了一些用于日志记录、带回滚预览等的选项。
  • 每个模块都有虚拟UpdateDatabaseBeforeSchemaUpdate()UpdateDatabaseAfterSchemaUpdate()方法。您可以在其中显着控制升级过程。

  • 正如您所提到的,某些升级将由 XPO 自动处理(例如,添加新列),但有些事情需要额外的控制,例如使用现有记录的默认值初始化新列。

    例如,假设 MyNewField已添加到 MyEntity应用程序 2.0 版中的 XPO 类。假设它应该默认为现有记录的值 3。 XPO 将处理新列的创建,但现有记录将为 NULL。 (如果您在 XPO 类中指定默认值,它将只与新记录有关)。为了更正现有记录的值,您可以将以下内容添加到实体模块的覆盖 UpdateDatabaseAfterSchemaUpdate() :
    public override void UpdateDatabaseAfterUpdateSchema()
    {
    base.UpdateDatabaseAfterUpdateSchema();
    if (CurrentDBVersion < new Version(2, 0, 0, 0))
    ObjectSpace.GetSession().ExecuteNonQuery(
    "UPDATE [MyEntity] SET [MyNewField] = 3 WHERE [MyNewField] IS NULL");
    }

    (如果您不想直接使用 SQL,也可以使用 ObjectSpace.GetObjects<MyEntity>()foreach。)

    在将表一分为二的更极端示例中,您可以使用相同的方法,但您将覆盖 UpdateDatabaseBeforeUpdateSchema()相反,运行 SQL 来拆分表,让 XPO 执行任何其他模式更新,并在必要时填充 UpdateDatabaseAfterUpdateSchema() 中的任何默认值。 .

    您会发现遇到约束问题,例如外键违规,因此您可能会发现需要编写一些通用例程,例如 DropAllForeignKeyConstraints()作为 UpdateDatabaseBeforeUpdateSchema() 的一部分.有时您会发现 XPO 已经提供了一些东西,有时却没有。缺少的约束和索引将在模式更新中重新生成。 (根据我的经验,切换主数据表的主键是最难正确更新的例程。)

    默认情况下,所有调用都发生在 SQL 事务中,因此如果有任何失败,它都应该回滚。

    开发人员需要注意对域模型的更改何时可能导致底层模式出现问题。

    对于测试,我们保留一些旧的客户数据库,并在构建过程中运行一系列前后测试,以确保现有客户能够正确升级他们正在升级的任何版本。在生产中,每当我们遇到升级问题时,都会将问题数据添加到此测试库中,以防止将来出现类似问题。

    我们正在与主要的国际公司和银行打交道。客户对结果非常满意。在公司的 DBA 需要签署更改的情况下,他们似乎不介意使用命令行工具而不是脚本来进行升级。

    关于entity-framework - DevExpress XPO 与 NHibernate 与 Entity Framework : database upgrading issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10679466/

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