.Net Core - 实体框架核心迁移 - 生产

2024-01-06

在这里阅读了许多问题后,在 Asp.Net 的 Github 上(我想到了这个 https://github.com/aspnet/EntityFrameworkCore/issues/5096,ServerFault 和 SoftwareEngineering,我决定问一个我自己的问题。

问题

代码优先迁移让早期开发过程变得异常轻松。登台或生产环境更难更新,尤其是在可能需要频繁更新的初始部署期间。 更新生产数据库要困难得多,而且由于许多很好的原因,自动迁移是不可能的——这些原因都在文档中写得很好,解释得很好,让我忽略了这条路线。 现在我正在寻找中间立场。

Approach

一旦应用程序的新版本发布,我们就可以检测是否有待处理的更改(诊断中间件“DatabaseErrorPageMiddleware”在我们使用它时已经执行此操作,显然我们不会在生产环境中执行此操作)。如果存在待处理的迁移,我们可以使站点脱机(有多种方法,为简洁起见,跳过),但仍然允许管理用户登录系统 - 可能是带有特定声明“IsAllowedToMigrate”:“true”的用户。 对于该用户,我们可以向他的管理导航添加一个操作。该页面可以列出待处理的更改,并公开更新到当前的方法(为了简单起见)。此操作方法甚至可以合并代码来备份数据库或类似的检查和平衡。

关于环境的假设

对于我的预期方法,我假设采用一种相当非正式的方法来更新应用程序 - 不涉及可能需要脚本的外部 DBA,迁移已经在生产数据库的最新备份等上进行了测试。 其次,我假设该网站可以显示为离线状态;我们打电话给ImaginarySiteManager.DisplayOffline(AVeryNiceMessage)。该虚构站点仍然可以提供管理后端的登录。 我还针对 SQL Server 进行了定制,并且对其他提供商一无所知。

一些代码

大部分代码都无耻地从中间件的源代码中窃取,为了测试它,我刚刚使用了管理员可用的 ActionMethod,尚未附加任何输出或操作

public async Task<IActionResult> TestPendingMigrations([FromServices] SomeDbContext dbContext)
{
    var relationalDatabaseCreator = dbContext.GetService<IDatabaseCreator>() as IRelationalDatabaseCreator;
    var migrationsAssembly = dbContext.GetService<IMigrationsAssembly>();
    var modelDiffer = dbContext.GetService<IMigrationsModelDiffer>();
    var databaseExists = await relationalDatabaseCreator.ExistsAsync();

    // HasDifferences will return true if there is no model snapshot, but if there is an existing database
    // and no model snapshot then we don't want to show the error page since they are most likely targeting
    // and existing database and have just misconfigured their model

    var pendingModelChanges
        = (!databaseExists || migrationsAssembly.ModelSnapshot != null)
          && modelDiffer.HasDifferences(migrationsAssembly.ModelSnapshot?.Model, dbContext.Model);

    var pendingMigrations
        = (databaseExists
            ? await dbContext.Database.GetPendingMigrationsAsync()
            : dbContext.Database.GetMigrations())
        .ToArray();
    // get Sitemanager.CurrentSite -> isClosed; closedMessage = "updates pending.." or similar.
    // add action to admin menu (update database).


    return new EmptyResult();
}

卡在这里

首先,测试挂起的迁移是否存在应该位于 Startup 中或紧邻 Startup 的位置。我正在尝试找出设置此功能的最佳位置。DbContext.OnModelCreating看起来是一个不错的起点? 但我如何等待完成并插入我的福尔摩斯模块进行调查?

应用迁移的代码也写在摩西的第六本书中:https://github.com/aspnet/AspNetCore/blob/master/src/Middleware/Diagnostics.EntityFrameworkCore/src/Views/DatabaseErrorPage.cshtml https://github.com/aspnet/AspNetCore/blob/master/src/Middleware/Diagnostics.EntityFrameworkCore/src/Views/DatabaseErrorPage.cshtml

所以理论上应该可以

  1. 启动(更新或未更新)应用程序
  2. 启动(或派生)确定数据库是否与模型匹配(pendingMigrations)并使网站离线
  3. 具有特定权限(声明或其他)的管理员可以登录并直接从后端运行迁移 - 作为唯一授权人员在必须发生时执行此操作

这是一个可行的方法吗?我错过了吗Microsoft.EntityFramework.Extensions.ProductionMigrationMadeSimple延伸并过度思考这个?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Net Core - 实体框架核心迁移 - 生产 的相关文章

  • 多个源的 makefile

    在学习 make 文件时 我试图为多个源目录编写一个 make 文件 似乎我在某个地方错了 这是我的代码结构 directory common fun2 c inc fun h src fun1 c main c 这是我的生成文件 CC c
  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 在现代 C++ 中,临时生命周期延长何时有用?

    在 C 中 您可以将函数的返回值 返回值 而不是引用 绑定到 const 引用 并且代码仍然有效 因为该临时对象的生命周期将延长到作用域末尾 例如 std string get string return abc void f const
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • 使用 dotnet pack 包含所有依赖项

    有什么办法可以强制dotnet pack包含所有引用的程序集 project json 中的所有依赖项 我相信这是相关的 https github com dotnet cli issues 1290 https github com do
  • 如何对 NServiceBus.Configure.WithWeb() 进行单元测试?

    我正在构建一个 WCF 服务 该服务接收外部 IP 上的请求并将其转换为通过 NServiceBus 发送的消息 我的单元测试之一调用Global Application Start 它执行应用程序的配置 然后尝试将 Web 服务解析为 验
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc

随机推荐

  • 定义实体框架 1:1 关联

    我试图在实体框架模型中定义两个实体之间的 1 1 关联 一个映射到表 另一个映射到视图 使用 DefinedQuery 当尝试在设计器中定义映射时 它让我选择 1 表或视图来映射关联 我应该选择什么 我可以选择两个表中的任何一个 但随后我被
  • 更新 Ruby on Rails 控制器中的参数

    我有一个控制器 我想在更新之前更新其中一个参数的值 以便在同一个保存到数据库的操作中进行更新 不幸的是 下面的代码没有设置z在数据库中 if model x YES model z blank model params z Time now
  • 如何在Eclipse的“运行配置”中设置“主类”

    在一个Java项目中 有两个java文件都有main方法 这两个java文件的绝对路径是 C Desktop project1 src com pre moveposition1 java And C Desktop project1 sr
  • TypeError:TextIOWrapper 类型的对象不可 JSON 序列化

    如果代码正常工作 那么每当有人在聊天中输入内容时 他们都会获得 5 经验 并且该信息会被放入 json文件 但发生的情况是每当有人在聊天中输入内容时就会出现此错误 on message users json dumps f TypeErro
  • Visual Studio Code 语言扩展继承现有的

    在 Visual Studio Code 中 只需提供语法文件即可添加自己的语言扩展 例如通过 JSON 我想为我使用的特定脚本语言提供语法文件 脚本语言嵌入在 ARM 汇编源代码中 并且已经存在一个插件 所以我基本上想通过我的脚本语言来扩
  • Log4j 1:如何在不更新版本到2.15.0的情况下缓解Log4j中的漏洞

    我正在使用 Log4j 1 2 16 我将其与 Maven 一起使用Selenium https en wikipedia org wiki Selenium 28software 29测试Java项目 我正在寻找一种无需升级Log4j版本
  • 创建动态 php 插入 mysql 函数?

    我有一篇包含很多变量的帖子 我想知道是否有某种方法可以动态地将信息插入到 mysql 中 而不是手动全部输入 因为帖子变量会根据用户选择的内容而变化 这就是我们用来做类似事情的方法 插入到我们无法控制的表中 并且没有 API 访问权限 使用
  • 如何在使用 Core Graphics 绘制的图像上设置辅助功能标签?

    我正在尝试围绕一些核心图形逻辑编写 UIAutomation 测试 目前我们正在使用核心图形来绘制图像 我正在尝试在图像上设置可访问性标签 标识符 值 以便我可以通过 UIAutomation 测试验证其存在 但无论我做什么 我都无法在 D
  • ListFragment 未渲染且适配器中的 getView() 未被调用

    据我所知 这可能是因为我的 ListView 没有显示 我已经验证 getCount 返回的值不为零 但我看不出我做错了什么 一切都加载并表现得好像它正在工作 但 ListView 从未出现 我在 mix xml 中的片段引用上放置了背景颜
  • 如何选择特定客户?

    我创建了以下表格 create table customers ID varchar 9 name varchar 15 CONSTRAINT pk id PRIMARY KEY ID create table living places
  • GMail 似乎忽略回复

    我正在使用 Gmail 帐户从我的网站发送电子邮件 我使用同一帐户来接收由我网站上的联系工具生成的电子邮件 我使用 回复 字段是为了更轻松地回复并轻松回复人们 该消息带有 发件人 地址 并忽略 回复 地址 这是我的标题 Return Pat
  • 如何更改 goroutine 闭包内的外部变量的值

    func this l PostUpload ctx Context ctx Response Status 500 l err models NewL this Config go func err l Save file if err
  • 如何从 Playwright 中的表格的特定列获取文本

    我正在使用 Playwright 进行 e2e 测试 我的问题陈述是我想获取表的特定列的所有行的文本内容 有问题的表格就像这里显示的一样 https ant design components table https ant design
  • 对象创建中的解构赋值

    和我的一样上一个问题 https stackoverflow com questions 69137422 confusing fmt behavior with nested lists 这是一个我无法判断我对 Raku 语义的理解是否遇
  • 通过 javascript 将值存储在 ViewBag 中

    如何在 ViewBag 中存储值并从 javascript 访问它 您无法通过 javascript 将值存储在 ViewBag 中 ViewBag是服务器端概念 仅存在于服务器上 JavaScript 在客户端上运行 至于将 ViewBa
  • 如何在 web.config 文件中添加命名空间?

    我正在使用 VS 2008 和 C 但是当我在中添加命名空间时web config文件中 该命名空间未导入或包含在code behind or aspx 我也读过this https stackoverflow com questions
  • 我应该保持与 Google 云存储的开放连接吗?

    为了与 Google Cloud Storage 通信 我遵循以下示例 https developers google com storage docs json api v1 json api java samples https dev
  • 正则表达式删除 <> 之间的所有内容

    我正在学习网络抓取 我掌握了一堆数据 但结构很混乱 我有一个这种形式的字符串向量 9 55 lt U 00A0 gt x lt U 00A0 gt 1016 现在 当我编写它时 我认为这是一种特殊的语法 因为如果不在 U 之前添加空格 我就
  • Pop OS 升级到 21.04 后 python3.8-venv 不再工作

    升级到 Pop OS 21 04 后 我无法为 python 3 8 创建任何虚拟环境 出现以下错误 sudo apt get install python3 8 venv Reading package lists Done Buildi
  • .Net Core - 实体框架核心迁移 - 生产

    在这里阅读了许多问题后 在 Asp Net 的 Github 上 我想到了这个 https github com aspnet EntityFrameworkCore issues 5096 ServerFault 和 SoftwareEn