Batching DB commands in Entity Framework 4.0

后端 未结 5 968
野趣味
野趣味 2020-11-28 13:51

My current project requires everyday synchronization with external system. The synchronization is based on complex import file structure which is parsed and processed with e

相关标签:
5条回答
  • 2020-11-28 14:12

    Be aware of this project: magiq.codeplex.com

    It brings batch operations to linq-to-sql and we are working in EntityFramework support by now.

    Cheers

    0 讨论(0)
  • 2020-11-28 14:15

    Here's a way that allows you to use your code first POCOs and is fast. Sped up a bulk insert from > 1 hour to ~5 seconds.

    SqlBulkCopy for Generic List (useful for Entity Framework & NHibernate).

    0 讨论(0)
  • 2020-11-28 14:18

    There are some workarounds in SQL Server:

    • Batch Inserts are described in the Entity Framework Bulk Copy article

    • Batch Updates (and Deletes) are described in the Multiple entity updates with Entity Framework – EF Fetch Updates article.

    In case you are interested in Oracle, MySQL, POstgreSQL, or SQLite, you can use the latest Devart dotConnect providers. The BatchUpdates functionality is already integrated in the SaveChanges method in the latest versions of these providers.

    0 讨论(0)
  • 2020-11-28 14:19

    No, it can't be done (yes - i weep also).

    EF does not support batch operations, LINQ-SQL had (has) the same problem.

    You've got a few options:

    1. Stored Procedures
    2. Classic ADO.NET or EntitySQL
    3. Triggers

    I've gone with option 1 and 3 in the past.

    The problem with all three approaches is you lose the EF abstraction, the internal graph (optimistic concurrency), and your brought back to the world of native SQL.

    0 讨论(0)
  • 2020-11-28 14:29

    Just sharing with you a GitHub project just for that, as of now, it supports Bulk insert/update/delete for Sql server transparently using SqlBulkCopy. https://github.com/MHanafy/EntityExtensions There're other goodies as well, and hopefully, It will be extended to do more down the track. Using it is as simple as

    var insertsAndupdates = new List<object>();
    var deletes = new List<object>();
    context.BulkUpdate(insertsAndupdates, deletes);
    

    Hope it helps!

    0 讨论(0)
提交回复
热议问题