EF4如何清除DbContext内部状态?

时间:2013-09-15 23:54:54

标签: c# entity-framework dbcontext

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

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

有以下限制因素:

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

IIRC,如果你:

,你在插入时获得了不错的加速
myDbcontext.Configuration.AutoDetectChangesEnabled = false;
myDbcontext.Configuration.ValidateOnSaveEnabled = false;

或许最好还是阅读一下:http://patrickdesjardins.com/blog/entity-framework-4-3-with-poco-and-track-change

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

答案 1 :(得分:1)

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