У меня есть приложение, которое при редактировании должно сохранять изменения и отслеживать и регистрировать, что это за изменения. Экран редактирования - это мастер. Объект разделен на 3 дочерних объекта. При выборе ссылки «Редактировать» в представлении индекса мастер извлекает строку для редактирования, вставляет ее в данные сеанса, а затем разделяет биты данных на подмодели, не относящиеся к сущности. Каждый из них может быть заполнен пользовательским вводом. При навигации по следующему или Prev строка Entity извлекается из данных сеанса, обновляется данными с экрана, на следующем отображаемом экране заполняется суб-объект, не являющийся базой данных, и т. Д.
Есть три поиска в базе данных, выполненные мастером для заполнения выпадающих списков. Они вызываются с указанным «.AsNoTracking».
Теперь, когда приходит время сохранять изменения, они не сохраняются, пока я не вызову context.Update (obj). Я подозреваю, что EF теряет сущность, изначально извлеченную в течение жизни Волшебника. Но использование context.Update (obj) позволяет отслеживать изменения, так что я не могу перехватить измененные значения.
Итак, я вернул Update (), чтобы решить проблему с измененными элементами позже. Строка сущности обновляется, и все поля помечаются как измененные. Мой журнал аудита пытается добавить измененные поля (которые являются всеми из них, потому что Update ()) и вызов Save Changes для журнала аудита выдает исключение параллелизма. Для журнала аудита не определены никакие токены.
Код ниже.
if (ModelState.IsValid)
{
try
{
_context.Update<Registration>(obj);
_context.SaveChanges(false);
SaveAuditTrail(obj);
RemoveRegistration();
}
catch (DbUpdateConcurrencyException ex)
{
ModelState.AddModelError("ConcurrentError", "This Registration was changed by another User before you could save it. Re-query the item and try again.");
CreateLogRow("Edit Registration", "testUser", "Concurrency exception for " + obj.StudentId, ex.Message);
return View("EditTransferInfo");
}
catch(SystemException ex)
{
ModelState.AddModelError(ex.GetBaseException().ToString(), ex.Message);
CreateLogRow("Edit Registration", "testUser", "System exception for " + obj.StudentId, ex.Message);
}
}
private void SaveAuditTrail(Registration registration)
{
foreach (var entry in _context.Entry(registration).Properties)
{
if (entry.IsModified)
{
AuditTrail auditRow = new AuditTrail
{
ModelName = "Registration",
KeyIdentifier = registration.StudentId,
OldValue = entry.OriginalValue.ToString(),
NewValue = entry.CurrentValue.ToString(),
WhenCreated = System.DateTime.Now,
WhoCreated = "testUser"
};
_context.AuditTrail.Add(auditRow);
_context.SaveChanges();
}
}
}
Теперь все мои сущности используют один и тот же DbContext. Должен ли я настраивать несколько контекстов? Один для «реальных» данных, один для справочных данных и один для раскрывающихся списков поиска?