EF4 如何清除 DbContext 内部状态

本文关键字:DbContext 内部 状态 清除 何清除 EF4 | 更新日期: 2023-09-27 18:31:21

如何

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

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

有以下限制在起作用:

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

2) 无法引入对 MSDTC 的依赖 - 因此我无法进行跨连接事务。

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

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

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

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

EF4 如何清除 DbContext 内部状态

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

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

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