我正在尝试将旧数据库中的数据转换为新数据库,其中主键的值很重要。
我目前拥有的代码就是这样(实际的表名替换为" 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或者a时 复制用户正在插入NOT FOR REPLICATION标识 。柱"
我已尝试在foreach循环中进行实际的数据库调用(IDENTITY_INSERT和SaveChanges()),但问题仍然存在。
我能为这个问题找到的答案都是代码优先的。