2

我正在尝试将旧数据库中的数据转换为新数据库,其中主键的值很重要。

我目前拥有的代码是这样的(实际表名替换为“TableName”):

using (var oldContext = new OldContext())
using (var newContext = new NewContext())
using (var transaction = newContext.Database.BeginTransaction())
{
    foreach (var item in GetConversionItems())
    {
        var newItem = Convert(item);
        newContext.TableName.Add(newItem);
    }

    try
    {
        newContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[TableName] ON;");
        newContext.SaveChanges();
        newContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[TableName] OFF");
        transaction.Commit();
    }
    catch (Exception e)
    {
        transaction.Rollback();
    }
}

我确实为主键明确分配了一个值。

public static TableName Convert(OldItem oldItem)
{
    ...
    newItem.ID = oldItem.CONTROL;
    ...
}

但我得到了例外:

“当 IDENTITY_INSERT 设置为 ON 或复制用户插入 NOT FOR REPLICATION 标识列时,必须为表 'TableName' 中的标识列指定显式值。”

我尝试在 foreach 循环中进行实际的数据库调用(IDENTITY_INSERT 和 SaveChanges()),但问题仍然存在。

我能够为这个问题找到的答案都是代码优先的。

4

0 回答 0