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" 选项。