【发布时间】:2021-10-16 10:33:32
【问题描述】:
有没有办法迁移包含所有表和关系的现有数据库以使用 SQL Server 自动 ID 而不是 Nhibernate (hilo) ID?
我们有一个使用 NHibernate 的 .NET 应用程序。但问题是,我们的int 用完了。
我知道这需要使用 id 设置为自动递增的新表重新创建表。有没有简单的迁移方法。例如,某种查询将复制表、保持关系,但现在使用 SQL Server id 而不是 hilo id。 hilo的最大问题,它使用共享ids,这使情况变得更糟。
例如,我们有一个包含 3 个表的数据库:
dbo.Usersdbo.RegistrationResultsdbo.UserNotes
表格:
dbo.Users
-
Idint(主要) -
Emailnvarchar(255) -
RegistrationResultFkint(外键)
dbo.RegistrationResults
-
Idint(主要) -
ValidationOutcomenvarchar(255)
dbo.UserNotes
-
Idint(主要) -
Messagenvarchar(255) -
RegistrationResultFkint(外键)
数据填充如下:
dbo.Users
| Id | RegistrationResultFk | |
|---|---|---|
| 1 | test@gmail.com | 2 |
| 4 | test2@gmail.com | 5 |
dbo.RegistrationResults
| Id | ValidationOutcome |
|---|---|
| 2 | Awaiting confirmation |
| 5 | Confirmed |
dbo.UserNotes
| Id | Message | RegistrationResultFk |
|---|---|---|
| 3 | it's a test | 2 |
| 6 | it's a test 2 | 5 |
我们希望迁移后的数据如下所示:
dbo.Users
| Id | RegistrationResultFk | |
|---|---|---|
| 1 | test@gmail.com | 1 |
| 2 | test2@gmail.com | 2 |
dbo.RegistrationResults
| Id | ValidationOutcome |
|---|---|
| 1 | Awaiting confirmation |
| 2 | Confirmed |
dbo.UserNotes
| Id | Message | RegistrationResultFk |
|---|---|---|
| 1 | it's a test | 1 |
| 2 | it's a test 2 | 2 |
【问题讨论】:
-
免责声明:我不太了解 NHibernate 的 HiLo,据我所知,NHibernate 管理和获取表的 id 的某种表。如果您检查 SQL Server 表,则每个表都有一列作为 Id INT(或 BIGINT),对吗?
-
您的意思是要更改数据库中现有
id的值以消除由nhibernate 创建的“间隙”,并为您提供更多空间仍然使用int数据类型,并更新所有使用这些值的外键?或者您是否可以接受将 id 数据类型从int更改为bigint identity列(其中数据类型更改会影响客户端应用程序,但在数据库端更容易做到)? -
最大,是的,每个表都有
intid。但是这个int在表之间共享。例如。我有桌子dbo.users。它有一行,ID 为 1。我还有另一个名为dbo.permissions的表,它以id2 开头。它是,因为 hilo 使用共享的id。所以这就是为什么它非常可怕。因为我们有 20 多个使用共享id的表,而且增长速度非常快。 -
这是一件非常难以自动化和完全正确的事情,仅适用于一个 ID 列(及其引用的列和表),它是 FK 和它的触发器,以及任何 View、sProcs 和/或引用该列的函数。为整个数据库做这件事是一项了不起的工作,专业的 DBA/顾问需要花费数周的时间来计划、编写脚本和准备,甚至需要工具来协助。在我的职业生涯中,我曾多次这样做,如果涉及 FK,仅验证该过程可能需要一周时间。
-
This article 描述了一位专业 DBA 仅仅为了更改 one 表的 ID 所经历的过程。我自己也会遵循同样的过程。对于整个数据库,这将被视为主要数据库运营项目。
标签: c# .net sql-server nhibernate