使用 Entity Framework 5 将大量数据从旧数据库移动到新数据库

Posted

技术标签:

【中文标题】使用 Entity Framework 5 将大量数据从旧数据库移动到新数据库【英文标题】:Move large amount of data from old database to new database using Entity Framework 5 【发布时间】:2015-03-24 17:57:41 【问题描述】:

我正在创建一个应用程序来将数据从旧数据库移动到新数据库(不同的架构)。我正在使用Visual Studio 2013C#Entity Framework 5Microsoft SQL Server 2012。此表 Customer 有超过 40,000 条记录

private void TransferCustomer()

    int counter = 0;

    // Load all old customers
    var oldCustomers = _oldRockDale.customers;

    foreach (var oldCustomer in oldCustomers)
    
        // Create new customer
        ...

        // Modify something
        ...

        // Add to collection
        <New_database_entity>.Customers.Add(newCustomer);

        // Insert to database for each 1000 records
        counter++;
        if (counter % 1000 == 0)
        
            <New_database_entity>.SaveChanges();
        
    

    // Insert the rest to database
    <New_database_entity>.SaveChanges();

这是我的问题:这个函数运行得越来越慢。对于前 1000 条记录,只需大约 20 到 30 秒。但它会变得慢得多。然后,需要 1 多分钟才能到达 2000。

我的问题是:

为什么运行速度越来越慢? 有没有更好的方法来传输这样的大量数据?

更多信息:正如我在Output 窗口中观察到的那样:

只有 1 行表明 线程以代码 0 退出。 之后,有很多行说 thread exited with code 259

非常感谢您的帮助。

【问题讨论】:

由于更改跟踪,它变得越来越慢。 我会尝试禁用它并等待结果。谢谢你的建议:) 更改跟踪最有用。您可能更愿意创建更多的数据库上下文(每 1,000 个实体一个)。 在我看来,四万行远不及“大”...顺便说一句:您可以使用 SQL Server Management Studio 轻松移动和转换数据(如果您的 DBMS 是 SQL Server,而您没有告诉我们)。 是的,我使用的是 SQL Server。我使用 C# 应用程序,因为我不擅长 SQL 并且有些数据需要修改。我和你有同样的想法,40k 行并不大。但为什么我的应用程序运行速度越来越慢? 【参考方案1】:

我认为这与 DbContext 的发展有关。

您可以利用以下帖子:

Fastest Way of Inserting in Entity Framework Improving bulk insert performance in Entity framework

例如,基本上您必须按 100 行的部分插入,并重置(再次设置,即:_context = new SomeContext();)每次插入之间的上下文。

【讨论】:

感谢您的有用评论。我会试试:)

以上是关于使用 Entity Framework 5 将大量数据从旧数据库移动到新数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用 Entity Framework 5 将特定 id 插入 MySQL 中的自动递增字段

我可以将 Entity Framework Core 6 与 Windows 窗体一起使用(使用 .NET 5)吗?

如何使用 Entity Framework Core 5.0 将复杂 SQL 查询的结果行映射到自定义 DTO?

从 Entity Framework 5 升级到 6

无法使用 Entity Framework 5 在 SQLite 数据库中插入记录

Entity Framework——执行sql语句