【问题标题】:Migrating from Nhibernate to EF6从 Nhibernate 迁移到 EF6
【发布时间】:2015-07-23 10:53:25
【问题描述】:
我目前有一个 .NET 应用程序,它有一个带有主键 GUID 的 SQL Sever 数据库。我们将 NHibernate 用于 ORM,但希望切换到最新版本的 Entity Framework 并使用 Identities(INTs) 作为我们的主键。
有没有人有任何经验或参考资料可以帮助我完成这个过渡?迁移数据和实施新 ORM 的最简单方法是什么?
【问题讨论】:
标签:
c#
sql-server
database
entity-framework
nhibernate
【解决方案1】:
这是一项重大更改,没有任何工具可帮助您进行此类迁移。您最好的选择是坚持使用 NHibernate。如果一定要改,就需要自己手动编写一个数据迁移工具。
【解决方案2】:
如果您因为迁移到 EF 而选择使用 int 键,您实际上不需要更改它,并且可以保留现有数据,请查看this。
但是,如果您出于其他原因需要移至 int 键,那将是困难的,也不是那么容易的。关于 GUID 的一件事是它永远不会重复,所以你可以做这样的事情,
- 导出当前结构中的所有 GUID(假设表名为 key_table)并插入到具有自动生成 ID 的新数据库中的表中。像这样的,
--------------------------------------------------
| Id | OldKey |
--------------------------------------------------
| 1| 3d09565d-eb84-4e9c-965c-d530c1be8cf2 |
--------------------------------------------------
| 2| 54a93dbc-7ce8-4c88-a8e0-70cc48a84073 |
--------------------------------------------------
-
当您插入时,您可以使用 select 语句从该表中获取键。无论您需要主键还是外键,诸如此类,
SET IDENTITY_INSERT User_Table ON;
插入到 User_Table (Id,RoleId,UserName,...)
值(从 key_table 中选择 id,其中 OldKey = '3d09565d-eb84-4e9c-965c-d530c1be8cf2'),(从 key_table 中选择 id,其中 OldKey = '54a93dbc-7ce8-4c88-a8e0-70cc48a84073'),'用户 1',.. .);
SET IDENTITY_INSERT User_Table 关闭;
这将是最简单的方法,但使用这种方法,新数据库中的 id 列将不是线性的。