2014-12-02 54 views
1

我在进程中插入/更新大量实体(〜5000),这需要花费大量时间(它在5分钟的事务中超时)。如何访问EntityManager中使用的DBContext?

我读到默认情况下DBContext.AutoDetectChangesEnabled设置为ON并导致这种行为(http://www.exsertus.be/2014/10/ef-bulk-performance/)。

就我的理解,Devforce“种类”在每个EntityManager中封装了一个DBContext。 Devforce使用它自己的实现,除非我定义了我所做的。我想知道如何访问它以便能够使用此属性AutoDetectChangesEnabled“玩”。

或者是否有任何其他解决方案使用Devforce插入/更新/删除大量实体?

问候

回答

0

既然已经定义了你自己的DbContext你可以用Configuration.AutoDetectChangesEnabled = false;

改变这个属性在构造函数中的DbContext设置但是,我不知道这种改变将有多少帮助。如果你的应用程序是多层的,并且你试图通过电线保存约5000个实体,这总是会很慢,并且你还会遇到通信超时。一般来说,如果您需要执行任何批量操作,DevForce不是最佳方法。

+0

嗨kim。考虑到所有的应用程序/模型是基于devforce的,最好的方法是什么?另外我注意到,当我调用SavesChanges()时,我可以等待超过1分钟才能看到发送给SQL服务器的第一个SQL顺序,为什么生成SQL这么长时间。我不知道是谁生成了它,Devforce或EF ... – kdev 2014-12-16 08:54:35

+0

EF生成SQL,但是可能会有更多的事情发生,而不仅仅是SQL生成使其变得缓慢。虽然我没有任何经验,但如果批量操作不是主应用程序的一部分,我会考虑使用EF实用程序。如果您希望IdeaBlade的某人进一步了解这一点,请通过网络支持表单打开技术支持案例。 – 2014-12-16 16:37:26

1

我有这个EF工具“https://www.nuget.org/packages/EFUtilities”的工作,我得到了很大的性能增强与大型插入,因为它使用批量复制,而不是每个实体的正常插入的。

您可以查看Github here的文档。

我用17000个实体插入事务处理它,并在几秒内完成它。 选中此项可以更好地了解和比较EF。 http://blog.credera.com/technology-insights/microsoft-solutions/entity-framework-batch-operations-using-ef-utilities/

使用工具插入实体列表的样本是这样的:

using (var db = new YourDbContext()) 
{ 
    EFBatchOperation.For(db, db.BlogPosts).InsertAll(list); 
} 

希望这有助于。

+0

不幸的是我不能使用这个,因为我需要主键修复程序 – kdev 2014-12-08 08:14:24

+0

你的意思是你生成你的ID?如果是这种情况,那很好,因为该工具可以在你的实体上工作,但不是将它们附加到上下文并逐一保存,这个工具将一举推动它们。图书馆绝对值得一试。 – 2014-12-08 08:18:18

+0

@kdev我想你是说你实际上插入到两个表中,需要将子行指向他们的父母?如果您使用父数据库生成的ID,这是一个难题。 (在这种情况下,我总是改用guid或类似的方式)。 – 2014-12-08 11:55:58