У нас есть веб-интерфейс, который обрабатывает множество запросов, иногда в секунду, и в начале каждого запроса мы отправляем запись в нашу журнальную таблицу с использованием инфраструктуры Entity.
Однако часто эта запись поступает в нашуlogtable заблокирует другой процесс, и я не понимаю, что его вызывает.
using (UnitOfWork unitofwork = new UnitOfWork())
{
unitofwork.WebApiRequestLogRepository.Insert(new WebApiRequestLog
{
Created = DateTime.Now,
Username = System.Threading.Thread.CurrentPrincipal.Identity.Name,
Controller = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName,
Method = actionContext.ActionDescriptor.ActionName,
MethodParameters = xml,
ApplicationVersion = AppSettings.Instance.Version,
Url = HttpContext.Current.Request.Url.ToString(),
});
unitofwork.Save();
}
Unitofwork - это обертка вокруг одного контекста, в который можно вносить несколько изменений одновременно.Сохранение вызывает context.SaveChanges
Код SQL, сгенерированный структурой сущностей
INSERT [log].[WebApiRequestLog]([Created], [Username], [Controller], [Method], [ApplicationVersion], [Url], [MethodParameters])
VALUES (@0, @1, @2, @3, @4, @5, @6)
SELECT [Id]
FROM [log].[WebApiRequestLog]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()
Может кто-нибудь объяснить мне, почему одна вставка в таблицу журнала может вызвать тупик?
Редактировать
public virtual void Insert(TEntity entity)
{
DbSet.Add(entity);
}
public void Save()
{
StringBuilder builder = new StringBuilder();
try
{
_context.Database.Log = s => builder.AppendLine(s);
_context.SaveChanges();
}
catch (DbEntityValidationException e)
{
HandleDbEntityValidationException(e);
}
catch (Exception e)
{
Exception ex = new Exception(builder.ToString(), e);
throw ex;
}
}