0

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

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

有以下限制在起作用:

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

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

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

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

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

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

4

2 回答 2

1

在您的应用程序中,您可以混合使用实体框架来读取数据并进行小型插入和更新,并使用 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

于 2013-09-16T04:40:01.900 回答
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

于 2013-09-16T00:11:59.500 回答