WPF C# 应用程序在安装更新时更新实体框架

Posted

技术标签:

【中文标题】WPF C# 应用程序在安装更新时更新实体框架【英文标题】:WPF C# Application updating the Entity Framework when installing an update 【发布时间】:2020-12-21 15:09:46 【问题描述】:

因此,在用各种搜索词在互联网上搜索了几天之后,我对我应该做什么,或者当通过安装应用程序执行更新时应该如何进行数据库更新一无所知。

到目前为止,我已经完成了所有迁移,并开始考虑获取设置脚本来执行此迁移。我的问题是,要做到这一点需要什么。

该应用程序没有什么特别之处,并且使用 NuGet 包管理器中的标准 EntityFramework,当前应用程序中没有错误并且运行良好,只是我需要开始研究如何在下一站执行此操作。有哪些最佳做法、陷阱等?

我来自网络背景,并花了 15 年的时间在实时生产服务器上进行这些迁移,所以对这个过程并不陌生。但是这个过程对我来说完全陌生,我不知道从哪里开始阅读和实验。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

假设 Code-First,并且每次安装只有一个数据库,那么在启动时应用迁移可能是最简单的事情。

EF 核心 https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/applying?tabs=dotnet-core-cli#apply-migrations-at-runtime

在 EF6 中使用 MigrateDatabaseToLatestVersion 初始化程序 https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.migratedatabasetolatestversion-2?view=entity-framework-6.2.0

【讨论】:

David,这是 EF6,我想我已经说清楚了。无论如何,我知道你分享的 MigrateDatabaseToLatestVersion 页面,但我没有让它工作,因为我不知道我到底在做什么。你有没有一些我可以用这种方法进一步研究的例子 是的,它是 Code First 作为方法。【参考方案2】:

添加以下内容解决了我的问题,因为其余代码都很好。我找不到明确答案的一件事是如何在安装应用程序时更新数据库,并且有一个现有的数据库。

事实证明,最简单的方法是在安装脚本中或在应用程序首次启动时调用以下内容。

var migrator = new DbMigrator(new Configuration());
migrator.Update();

配置类是实体框架生成的类,以防有人好奇。

internal sealed class Configuration : DbMigrationsConfiguration<DBContext>

    public Configuration()
    
        AutomaticMigrationsEnabled = true;
    

    protected override void Seed(DBContext context)
    
    //  This method will be called after migrating to the latest version.
    //  You can use the DbSet<T>.AddOrUpdate() helper extension method
    //  to avoid creating duplicate seed data.
    

【讨论】:

我强烈建议禁用自动迁移,而是在您更改某些内容时手动创建新迁移 - 您仍然可以自动应用它们。 但是,我主要使用连接到 oracle 的 EF6。使用 oracle,自动迁移是完全疯狂的,因为更改数据库通常需要一些手动干预。它可能与 MS SQL 一起工作得更好...... @grek40,请解释一下为什么要手动推荐?这是一个 WPF 应用程序,我无法亲自到世界的各个角落来完成这项工作。除非我不明白你的意思! 我的意思是,AutomaticMigrationsEnabled = false 在您的 VS 包管理器控制台中,选择模型项目,执行类似Add-Migration "MyTestMigration" 的操作。然后应该在与Configuration.cs 相同的文件夹中创建一个迁移文件,名称类似于[timestamp]_MyTestMigration.cs(以及一些资源+设计器文件)。此迁移将包含 UpDown 方法,以及更改数据库的代码。您仍然可以使用代码在应用程序运行时自动应用创建的迁移。 @grek40 老实说,我不明白它实际上做了什么,因为在手动场景中它不会以任何方式自动更新。如果我有运行配置更新的代码,在代码中运行它,那么是的,当我不想要它时,数据库会更新。所以我想对于其他阅读这篇文章的人来说,这是一个合理的建议。特别是如果您处于我的位置,并且仍然在应用程序世界中掌握 ORM 样式框架。

以上是关于WPF C# 应用程序在安装更新时更新实体框架的主要内容,如果未能解决你的问题,请参考以下文章

使用实体框架核心模型时 WPF 数据网格未更新

wpf 应用程序在安装时不检查更新

如何在 C# 和 WPF 中的实体框架中创建数据库和表?

如何使用实体框架从 DataGrid 更新数据库

为啥要在移动设备中使用实体框架?

c# 不更新数据库