MySQL 到 MSSQL 保持外键关系
MySQL to MSSQL keep foreign key relationships
我目前正在尝试从旧 MySQL (5.0) 迁移到 MSSQL。因为我必须保留主键关系,所以我现在面临一个问题。 table 中的某些数据以 6102 而不是 1 的 ID 开头。我可以通过增加有效的种子来解决这个问题。现在,在几千个数据集之后,我有了一些飞跃,例如从 id 22569 到 22597。这发生了多次。
我现在基本上做的是,select 来自源数据库 (MySQL) 的所有数据,将它们映射到生成的模型中,并尝试将此模型映射到我的目标模型 ( MSSQL)。 (我这样做是因为目标,新结构与现有结构略有不同。)当我忽略这些飞跃时,我稍后会遇到其他几个 table 外键违规。
所以我目前的解决方案是,从每个映射开始计数,当当前模型的 id 与计数器不同时,手动重置数据库中的种子。
DBCC CHECKIDENT (mytable, RESEED, idFromCurrentModel);
是否有可能分别强制 entity framework 服务器从我的模型中接受 id 而不是忽略它并使用 ident 值?
感谢阅读并致以最诚挚的问候
编辑
如果有人想知道我是如何解决这个问题的,那就是:
var context = new TestEntities();
// map mysql data to mssql model and convert data
// let's assume I did this
var mapped = new List<Test>()
{
new Test() {id= 42, bar = "foo", created = DateTime.Now},
new Test() {id= 1337, bar = "bar", created = DateTime.Now}
};
var transaction = context.Database.BeginTransaction();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [SeedingTest].[dbo].[Test] ON");
context.Test.AddRange(mapped);
context.SaveChanges();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [SeedingTest].[dbo].[Test] OFF");
transaction.Commit();
context.Dispose();
这只在我这样做时有效:
右键单击我的 *.edmx 文件,打开并删除
StoreGeneratedPattern="Identity"
在您的身份栏中。在我的例子中,它看起来像这样:
...
<Property Name="id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
...
删除它后,EF 不再忽略我的设置 ID。
附加信息:
添加此属性
[DatabaseGenerated(DatabaseGeneratedOption.None)]
我生成的模型中的 id 没有 工作。
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int foo { get; set; }
public string bar { get; set; }
...
最简单的方法是将种子初始设置为当前最大 Id 值 + 1。然后,在插入转换后的行时执行以下操作
set identity_insert on tablename -- stops generation of IDENTITY, requires user to supply it
insert into tablename values (Id....) -- supply value of Id
set identity_insert_off tablename -- turn inedtity generation back on
这个做得很好。
我目前正在尝试从旧 MySQL (5.0) 迁移到 MSSQL。因为我必须保留主键关系,所以我现在面临一个问题。 table 中的某些数据以 6102 而不是 1 的 ID 开头。我可以通过增加有效的种子来解决这个问题。现在,在几千个数据集之后,我有了一些飞跃,例如从 id 22569 到 22597。这发生了多次。
我现在基本上做的是,select 来自源数据库 (MySQL) 的所有数据,将它们映射到生成的模型中,并尝试将此模型映射到我的目标模型 ( MSSQL)。 (我这样做是因为目标,新结构与现有结构略有不同。)当我忽略这些飞跃时,我稍后会遇到其他几个 table 外键违规。
所以我目前的解决方案是,从每个映射开始计数,当当前模型的 id 与计数器不同时,手动重置数据库中的种子。
DBCC CHECKIDENT (mytable, RESEED, idFromCurrentModel);
是否有可能分别强制 entity framework 服务器从我的模型中接受 id 而不是忽略它并使用 ident 值?
感谢阅读并致以最诚挚的问候
编辑
如果有人想知道我是如何解决这个问题的,那就是:
var context = new TestEntities();
// map mysql data to mssql model and convert data
// let's assume I did this
var mapped = new List<Test>()
{
new Test() {id= 42, bar = "foo", created = DateTime.Now},
new Test() {id= 1337, bar = "bar", created = DateTime.Now}
};
var transaction = context.Database.BeginTransaction();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [SeedingTest].[dbo].[Test] ON");
context.Test.AddRange(mapped);
context.SaveChanges();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [SeedingTest].[dbo].[Test] OFF");
transaction.Commit();
context.Dispose();
这只在我这样做时有效:
右键单击我的 *.edmx 文件,打开并删除
StoreGeneratedPattern="Identity"
在您的身份栏中。在我的例子中,它看起来像这样:
...
<Property Name="id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
...
删除它后,EF 不再忽略我的设置 ID。
附加信息:
添加此属性
[DatabaseGenerated(DatabaseGeneratedOption.None)]
我生成的模型中的 id 没有 工作。
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int foo { get; set; }
public string bar { get; set; }
...
最简单的方法是将种子初始设置为当前最大 Id 值 + 1。然后,在插入转换后的行时执行以下操作
set identity_insert on tablename -- stops generation of IDENTITY, requires user to supply it
insert into tablename values (Id....) -- supply value of Id
set identity_insert_off tablename -- turn inedtity generation back on
这个做得很好。