Entity Framework C# - 将数据从一个数据库移动到具有相似结构的另一个数据库
Entity Framework C# - Moving data from one database to another with similar structure
我有两个 SQL Express 数据库,第一个里面有很多数据,但是我们已经构建了一个新的应用程序,它将 运行 在具有类似 [=41] 的数据库上=] 结构(添加了一些列,删除了一些,合并了一些 tables 等)。客户是一样的,他们想在新应用中使用旧数据。
所以我现在要做的是从旧数据库移动数据(table 到 table),将实体(手动)从旧格式转换为新格式然后最后将该新实体保存在我的新数据库中。
我正在使用 Entity Framework,服务器是 ASP.NET Web Api。我创建了两个单独的 DbContext,一个用于旧数据库,一个用于新数据库。
我能够从旧数据库中获取我的数据,对其进行转换,但随后我 运行 进入我的问题,我需要标识列保持不变,以便我可以维护旧数据库中存在的关系DB,但是当我尝试保存实体时,EF 告诉我当 Identity_Insert 关闭时我无法在标识列中插入值。
这是我的实际错误信息:
Cannot insert explicit value for identity column in table 'AccessoryProfiles' when IDENTITY_INSERT is set to OFF.
这是我尝试迁移数据的控制器方法:
public IHttpActionResult Get()
{
try
{
var manager = new MigrationManager<AccessoryProfile>();
var entities = manager.GetAll();
foreach (var profile in entities)
{
var newEntity = new Entities.Server.Accessories.AccessoryProfile
{
Id = profile.AccessoryProfileId,
Name = profile.Name,
CreatedDate = profile.CreatedDate,
LastModifiedDate = profile.LastModifiedDate,
DeletedDate = profile.DeletedDate
};
DataService.AccessoryProfile.Add(newEntity);
}
DataService.AccessoryProfile.Commit();
return Ok();
}
catch (Exception exc)
{
Logger.Error(exc);
return null;
}
}
MigrationManager<T>
处理旧数据库,而 DataService
处理新数据库。
我试过在 Id 上设置 [DatabaseGenerated(DatabaseGeneratedOption.None)],但没有成功。我已经在 Commit() 之前尝试 运行ning 这个:
DbContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[AccessoryProfiles] ON");
...但我仍然无法在标识列中插入值。
我应该如何使用 Entity Framework 执行此操作?
或者,如果您知道比使用 EF 更好的方法,我会洗耳恭听。
谢谢!
如果要插入整个 table,我建议使用 EntityFramework.BulkInsert。对于很多记录,“.Add”或“.AddRange”扩展非常慢。
这里是bulkinsert的描述和速度优势:
https://efbulkinsert.codeplex.com/
您还可以查看此主题以了解更多信息:
Fastest Way of Inserting in Entity Framework
设置 SqlBulkCopy 时,它允许您使用不同的 SqlBulkCopyOptions 重载它。我相信其中之一是 "KeepIdentity",它允许您保留源标识。我想这可能就是您要找的。
因此,当您设置 sqlbulkcopy 对象时,您可能会这样写:
SqlBulkCopy copy = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.KeepIdentity| SqlBulkCopyOptions.Default, null);
还要确保您没有使用 "CheckConstraints" 选项。
我有两个 SQL Express 数据库,第一个里面有很多数据,但是我们已经构建了一个新的应用程序,它将 运行 在具有类似 [=41] 的数据库上=] 结构(添加了一些列,删除了一些,合并了一些 tables 等)。客户是一样的,他们想在新应用中使用旧数据。
所以我现在要做的是从旧数据库移动数据(table 到 table),将实体(手动)从旧格式转换为新格式然后最后将该新实体保存在我的新数据库中。
我正在使用 Entity Framework,服务器是 ASP.NET Web Api。我创建了两个单独的 DbContext,一个用于旧数据库,一个用于新数据库。 我能够从旧数据库中获取我的数据,对其进行转换,但随后我 运行 进入我的问题,我需要标识列保持不变,以便我可以维护旧数据库中存在的关系DB,但是当我尝试保存实体时,EF 告诉我当 Identity_Insert 关闭时我无法在标识列中插入值。
这是我的实际错误信息:
Cannot insert explicit value for identity column in table 'AccessoryProfiles' when IDENTITY_INSERT is set to OFF.
这是我尝试迁移数据的控制器方法:
public IHttpActionResult Get()
{
try
{
var manager = new MigrationManager<AccessoryProfile>();
var entities = manager.GetAll();
foreach (var profile in entities)
{
var newEntity = new Entities.Server.Accessories.AccessoryProfile
{
Id = profile.AccessoryProfileId,
Name = profile.Name,
CreatedDate = profile.CreatedDate,
LastModifiedDate = profile.LastModifiedDate,
DeletedDate = profile.DeletedDate
};
DataService.AccessoryProfile.Add(newEntity);
}
DataService.AccessoryProfile.Commit();
return Ok();
}
catch (Exception exc)
{
Logger.Error(exc);
return null;
}
}
MigrationManager<T>
处理旧数据库,而 DataService
处理新数据库。
我试过在 Id 上设置 [DatabaseGenerated(DatabaseGeneratedOption.None)],但没有成功。我已经在 Commit() 之前尝试 运行ning 这个:
DbContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[AccessoryProfiles] ON");
...但我仍然无法在标识列中插入值。
我应该如何使用 Entity Framework 执行此操作? 或者,如果您知道比使用 EF 更好的方法,我会洗耳恭听。 谢谢!
如果要插入整个 table,我建议使用 EntityFramework.BulkInsert。对于很多记录,“.Add”或“.AddRange”扩展非常慢。
这里是bulkinsert的描述和速度优势: https://efbulkinsert.codeplex.com/
您还可以查看此主题以了解更多信息: Fastest Way of Inserting in Entity Framework
设置 SqlBulkCopy 时,它允许您使用不同的 SqlBulkCopyOptions 重载它。我相信其中之一是 "KeepIdentity",它允许您保留源标识。我想这可能就是您要找的。
因此,当您设置 sqlbulkcopy 对象时,您可能会这样写:
SqlBulkCopy copy = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.KeepIdentity| SqlBulkCopyOptions.Default, null);
还要确保您没有使用 "CheckConstraints" 选项。