【发布时间】:2021-08-06 19:55:06
【问题描述】:
我在我的 Blazor Server 项目中使用 Microsoft.AspNetCore.Identity.EntityFramework 并毫无问题地对其进行了自定义。我确实喜欢 Identity 的简单性和稳健性;但是,由于我正在为部署进行开发,因此遇到了一个小问题。在灾难恢复中,从 MSSQL 备份进行完整还原可以顺利进行。如果您没有为已部署的 Blazor 服务器项目更改 ApplicationDbContext 中的任何内容,则这种类型的备份至关重要。因此,对于将灾难恢复到相同状态和 DbContext 的问题,没有问题,但是如果您在 DbContext 中从一个安装到另一个安装有小的更改,或者说您正在升级 Blazor 服务器项目的先前版本并进行更改在上下文中,您无法恢复用户,因为您只能使用以前的 DbContext 作为 Db Schema 和 Design 进行完整的 FULL 恢复。
如何恢复,或者更好的是,将日期从 DBContext 的一个实例迁移到另一个实例?我尝试从备份设备进行数据还原,但由于用户表与用户声明和用户角色表之间的外键,它不允许我进行还原。外键约束不允许我使用先前生成的 GUID 恢复用户,其中包含指向其他数据的重要信息链接。例如,一个表跟踪用户创建的事件,如果我重新创建用户,它的 GUID 与备份中注册的 GUID 不同。
我们将不胜感激。
如果您在表中查询 ASPNetUsers,您会得到以下信息:
Id UserName NormalizedUserName Email NormalizedEmail EmailConfirmed PasswordHash SecurityStamp ConcurrencyStamp PhoneNumber PhoneNumberConfirmed TwoFactorEnabled LockoutEnd LockoutEnabled AccessFailedCount
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------- ---------------- ---------------------------------- -------------- -----------------
6cd26b55-b0c6-41ae-ac6c-ff9ae3242c3b userone@mymail.com USERONE@MYMAIL.COM userone@mymail.com USERONE@MYMAIL.COM 1 AQAAAAEAACcQAAAAECp/NfxxEWw8fbd0jIrXOGZ/v/ggPscxMIINueP2dUQAihgRwrE1a+t1os/7MwvPCg== OJP4HUHN6FNCXHXETVJTDQLC6RBUCLJS f69a0ff7-9298-4d1f-8faa-e8ab3db3ab70 NULL 0 0 NULL 1 0
9eda9ba1-dd47-4308-ba62-a19381a32d56 usertwo@mymail.com USERTWO@MYMAIL.COM usertwo@mymail.com USERTWO@MYMAIL.COM 1 AQAAAAEAACcQAAAAEFcXpQREt8sfhssYHlH/hRSlk3yX/bGMCYpXpTrid+YLNMFkDr5V45MnIo0JOPmWlw== YLZJSYILLPQZBFGCOJLXKFZB64YXCHIK c389b663-fcd1-4918-b9ed-54bc583666cc NULL 0 0 NULL 1 0
(2 rows affected)
Completion time: 2021-08-06T14:19:46.8143727-07:00
由于 Id 是由 EF Core 身份表生成的 GUID,并且链接到其他 ASPNetCore 表,例如 UserRoles、UserClaims 等,我如何使用之前生成的旧 GUID 导入用户数据?
2021 年 8 月 12 日编辑
我找到了解决此问题的临时解决方法。为了便于说明,我将使用 APP、OriginalDB、BackedUpDevice(bak 文件)以及 RestoredDB 和 NewDB。
OriginalDB 我将继续研究模型和 ASP.Net Core/Blazor 应用程序 (APP),因此有时模型会发生变化。我有我的应用程序,当它第一次初始化时,它使用模型在服务器上创建数据库,如果它不存在的话。我使用迁移来创建新模型,以便在第一次运行时放在服务器上。 ASP.Net Core Identity 促进了这一点。
所以,原来的问题只有在APP中修改模型,APP需要重新申请迁移时才会出现。我不使用后续迁移,因为一旦使用 OriginalDB,就会有数据,即使模型发生变化,也需要复制数据。我对此完全没有问题。我可以从BackedUpDevice 恢复到另一个数据库作为RestoredDB。然后,我使用 RestoredDB 将数据插入回 NewDB,这是 OriginalDB 模式和 APP 中模型更改的新创建副本。因此,这给了我我的数据,但我不能将此方法用于 ASP.Net Core Identity 表,因为它使用外键。
我发现的解决方法是,我可以安全地删除 ASP.Net Core Identity 表,即 AspNetRoles、AspNetUserClaims、AspNetUserLogins、AspNetUserRoles、AspNetUsers,并将模式和表从 RestoredDB 复制到 NewDB .虽然使用这种方法重新创建表是可行的,但我遇到的问题是我还修改了这些用户表,不仅更改了表名,而且还添加了主要在This Article 中显示的自定义字段,在 APP 的未来迭代中,有可能是影响这些表的其他自定义字段和/或更改。因此,为什么我需要查看如何将 RestoreDB 用户表数据,包括为具有外键的用户生成的 GUID 复制到 NewDB 用户表。任何建议将不胜感激。
【问题讨论】:
标签: sql-server entity-framework-core blazor-server-side database-administration asp.net-core-5.0