我正在尝试将旧数据库中的数据转换为新数据库,其中主键的值很重要。
我目前拥有的代码是这样的(实际表名替换为“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()),但问题仍然存在。
我能够为这个问题找到的答案都是代码优先的。