我有一个返回大量数据的过程(提交时需要 50-100k 个实体的顺序)
我正在执行我Add
之前的所有 s Commit
(工作单元模式)。我对提交实际需要多长时间并不太在意——这个过程运行时间很长(几周),所以这里或那里的一分钟并不是世界末日,而是在提交期间,第二个应用程序使用相同的摘要实体和上下文无法从数据库表中读取并最终超时。
如果我等到提交发生并尝试从应用程序 #2 再次读取,它几乎可以立即工作。
那么,我如何告诉 EF 在提交期间不要锁定表(大概是它在做什么?)?
关键代码在这里:
Dim DBTask = TaskRepository.Single(function(x) x.Id = CurrentTaskId)
''Task is a class which stores the results from the process before committing them
For Each Result In Task.Results
Dim DbResult = TaskResultRepository.CreateInstance
DbResult.Field1 = Result.Field1
DbResult.Field2 = Result.Field2
DbTask.Results.Add(DbResult)
Next
DbTask.JobStatus = Entities.JobStatuses.Completed
QLog.DebugFormat("Committing Task {1}: {0}", Task.Name, Task.Id)
UnitOfWork.Commit()
Tasks.Remove(Task)
QLog.InfoFormat("End Task {1}: {0}", Task.Name, Task.Id)
更糟糕的是,我目前缺乏工具,因为有人放错了 SQL Server 安装磁盘,所以没有 Management Studio/Performance Analyser,只有服务器资源管理器。
作为参考,我的Repository(Of T As Entitybase).CreateInstance
方法是:
Protected ReadOnly Entities As IDbSet(Of T)
Public Function CreateInstance() As T Implements Interfaces.IRepository(Of T).CreateInstance
Dim Entity = Entities.Create(Of T)()
With Entity
.CreatedOn = Now
End With
Entities.Add(Entity)
Return Entity
End Function