从 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
Id
int(主要)
Email
nvarchar(255)
RegistrationResultFk
int(外键)
dbo.RegistrationResults
Id
int(主要)
ValidationOutcome
nvarchar(255)
dbo.UserNotes
Id
int(主要)
Message
nvarchar(255)
RegistrationResultFk
int(外键)
数据填充如下:
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,您还可以导航到数据库 -> 可编程性 -> 序列 ==>
右键单击新序列。
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);
}
有没有一种方法可以迁移包含所有表和关系的现有数据库以使用 SQL 服务器自动 ID 而不是 Nhibernate (hilo) ID?
我们有一个使用 NHibernate 的 .NET 应用程序。但问题是,我们 运行 出 int
.
我知道这需要用新的表格重新创建表格,这些表格的 ID 设置为自动递增。有没有简单的迁移方法。例如,某种查询将复制表、保持关系,但现在使用 SQL 服务器 ID 而不是 hilo ID。 hilo 最大的问题,它使用共享ids
,这使情况变得更糟。
例如,我们有一个包含 3 个表的数据库:
dbo.Users
dbo.RegistrationResults
dbo.UserNotes
表:
dbo.Users
Id
int(主要)Email
nvarchar(255)RegistrationResultFk
int(外键)
dbo.RegistrationResults
Id
int(主要)ValidationOutcome
nvarchar(255)
dbo.UserNotes
Id
int(主要)Message
nvarchar(255)RegistrationResultFk
int(外键)
数据填充如下:
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,您还可以导航到数据库 -> 可编程性 -> 序列 ==>
右键单击新序列。
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);
}