关于c#:EF4如何清除DbContext内部状态?

EF4 How to clear DbContext internal state?

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

我有一个数据库更新程序,该程序在事务中通过EF4在各种表上执行大量插入操作。我发现随着更新的进行,插入到通用Permissions表的速度越来越慢。

有以下限制在起作用:

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

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

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

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

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

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


在您的应用程序中,可以混合使用Entity Framework来读取数据以及进行小的插入和更新,并使用ADO.NET DataAdapters进行批量插入和更新http://msdn.microsoft.com/zh-cn/library/aadf8fk2??。 aspx

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


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

1
2
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/zh-cn/library/tchktcdk.aspx#sectionSection2