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。

Source

附加信息:

添加此属性

[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

这个做得很好。