На основании приведенного выше кода, учитывая, что обновленный объект workItem был загружен в рамках контекста БД и что эти 2 значения являются строками, я должен сказать с уверенностью 99,5%, что этот код не отвечает заповедение, которое вы видите.(хотя я определенно буду наблюдать за этим пунктом, чтобы увидеть, доказано ли, что это неправильно :) Я бы внимательно посмотрел везде, где используются Status или StatusDetails в отношении вызовов, сделанных в службу.Я подозреваю, что какой-то другой код неожиданно меняет один или другой и вызывает SaveChanges.
Небольшая оптимизация, которую я могу предложить:
var nextReviewer = context.WorkItemReviewers
.Where(r => r.WorkItemId == workItem.Id
&& r.Position > workItem.NextReviewerPosition)
.OrderBy(r => r.Position)
.Select(r => new { r.Position }) // Add any other details you may need from reviewer and other related entities.
.FirstOrDefault();
if (nextReviewer != null)
{
workItem.Status = "A";
workItem.StatusDetails = "A";
workItem.NextReviewerPosition = nextReviewer.Position;
//Other Code
}
else
{
workItem.Status = "B";
workItem.StatusDetails = "B";
workItem.NextReviewerPosition = null;
}
Используя .Select()
, вы можете оптимизировать запрос доверните обратно столбцы из таблиц, которые вам нужны, что сделает вызовы в БД быстрее.Если не ожидается, что запрос будет относительно тяжелым с точки зрения времени (например,> ~ 500 мс), я бы также избегал асинхронной операции.Его цель - сделать сервер более отзывчивым при работе с большими операциями.Использование всего этого сделает все операции чуть медленнее, чем необходимо.После того, как вы оптимизировали возвращаемые данные, можно рассмотреть асинхронность, если все еще требуется некоторое время, чтобы прожевать.