从 NHibernate ids (hilo) 迁移到 SQL 服务器中的 SQL auto ids

Migrate from NHibernate ids (hilo) to SQL auto ids in SQL Server

有没有一种方法可以迁移包含所有表和关系的现有数据库以使用 SQL 服务器自动 ID 而不是 Nhibernate (hilo) ID?

我们有一个使用 NHibernate 的 .NET 应用程序。但问题是,我们 运行 出 int.

我知道这需要用新的表格重新创建表格,这些表格的 ID 设置为自动递增。有没有简单的迁移方法。例如,某种查询将复制表、保持关系,但现在使用 SQL 服务器 ID 而不是 hilo ID。 hilo 最大的问题,它使用共享ids,这使情况变得更糟。

例如,我们有一个包含 3 个表的数据库:

表:

dbo.Users

dbo.RegistrationResults

dbo.UserNotes

数据填充如下:

dbo.Users

编号 电子邮件 RegistrationResultFk
1 测试@gmail.com 2
4 test2@gmail.com 5

dbo.RegistrationResults

编号 验证结果
2 等待确认
5 已确认

dbo.UserNotes

编号 留言 RegistrationResultFk
3 这是一个测试 2
6 这是测试2 5

我们希望迁移后的数据如下所示:

dbo.Users

编号 电子邮件 RegistrationResultFk
1 测试@gmail.com 1
2 test2@gmail.com 2

dbo.RegistrationResults

编号 验证结果
1 等待确认
2 已确认

dbo.UserNotes

编号 留言 RegistrationResultFk
1 这是一个测试 1
2 这是测试2 2

我建议你,为了尽量减少影响,使用 Sequences 等同于自动增量字段,但存储在 table.

之外

下面是 table

的简单示例

创建序列

此代码创建一个序列。
使用 SSMS,您还可以导航到数据库 -> 可编程性 -> 序列 ==> 右键单击新序列。

Full Syntax.

CREATE SEQUENCE dbo.UserId 
    AS INT
    START WITH 1234 
    INCREMENT BY 1   
    ;  

仔细阅读语法以更好地设置序列,例如,您可能希望设置 CACHE 以提高性能,从而最大限度地减少生成所需的 IOs序号

获取ID

要获取 ID,您必须使用 NHibernate 发出原始查询。
NHibarnate Reference
NEXT VALUE

public int GetNextUserId(Session session)
{
    var query = session.CreateSQLQuery("SELECT NEXT VALUE FOR dbo.UserId");
    var result = query.UniqueResult();
    return Convert.ToInt32(result);
}