大量のデータを返すプロセスがあります(コミット時に50〜100kエンティティのオーダーが必要です)
私は(作業単位パターン)Add
の前にすべてのを実行しています。コミットに実際にかかる時間についてはあまりCommit
気になりません-プロセスは非常に長時間(数週間)かかるので、ここで1分、または世界の終わりはありませんが、コミット中に、同じ抽象を使用する2番目のアプリケーションエンティティとコンテキストはデータベーステーブルから読み取ることができず、最終的にタイムアウトします。
コミットが発生するまで待って、アプリ#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がなく、ServerExplorerだけであるという点でツールが不足しています。
参考までに、私の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