【问题标题】:EF4 How to clear DbContext internal state?EF4 如何清除 DbContext 内部状态?
【发布时间】:2013-09-20 01:15:57
【问题描述】:

如何告诉 EF4 DbContext 清除其内部缓存/状态?

我有一个数据库更新程序,它在事务中通过 EF4 对各种表执行大量插入操作。我发现随着更新的进行,对通用权限表的插入会变得越来越慢。

存在以下限制:

1) 一切都必须发生在单个(巨型)事务中。

2) 不能引入对 MSDTC 的依赖 - 所以我不能进行交叉连接事务。

3) 似乎无法为已打开的 SqlConnection 打开新的 DbContext - 遇到“EntityConnection 只能通过关闭的 DbConnection 构造”错误。 (请注意,我已经在多个 DbContext 之间共享一个 SqlConnection,但只有在它们全部初始化后才打开连接)

鉴于这些限制,我无法为每个工作块创建一个新的 DbContext,因为它会破坏事务。

我已经满足了这些功能限制,但性能很差。我怀疑 DbContext 正在努力处理插入到 DbSet 中的数据量。

如何告诉 DbContext 重置其内部缓存(例如,我最近插入的行并且不再关心)?

【问题讨论】:

    标签: c# entity-framework dbcontext


    【解决方案1】:

    IIRC,如果您满足以下条件,您会在插入时获得不错的加速:

    myDbcontext.Configuration.AutoDetectChangesEnabled = false;
    myDbcontext.Configuration.ValidateOnSaveEnabled = false;
    

    也许最好读一下这个:http://patrickdesjardins.com/blog/entity-framework-4-3-with-poco-and-track-change

    我可能会放弃 EF 来使用 SqlBulkCopy 进行巨大的插入。相关部分在这里:http://msdn.microsoft.com/en-us/library/tchktcdk.aspx#sectionSection2

    【讨论】:

    • 感谢spender,我们实际上已将其移至原始SQL 并获得了巨大的性能提升,并且很可能会解决此问题。感谢您的提示。
    【解决方案2】:

    在您的应用程序中,您可以混合使用实体框架来读取数据并进行小型插入和更新,并使用 ADO.NET DataAdapters 进行批量插入和更新http://msdn.microsoft.com/en-us/library/aadf8fk2.aspx

    或者,您可以使用 EF5 http://msdn.microsoft.com/en-us/library/gg679456(v=vs.103).aspx 的 ExecuteSQLCommand 结合存储过程执行插入操作,并传递 Table 参数以传递批量数据。在 EF4 中是 ExecuteStoreCommand http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.executestorecommand.aspx

    【讨论】:

    • 感谢 carbo,这差不多就是我们所做的,感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 2014-04-30
    • 1970-01-01
    • 2011-07-15
    • 2016-12-12
    • 2015-12-01
    • 2022-11-04
    • 1970-01-01
    相关资源
    最近更新 更多