Один или несколько DbContexts? - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть приложение, которое при редактировании должно сохранять изменения и отслеживать и регистрировать, что это за изменения. Экран редактирования - это мастер. Объект разделен на 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. Должен ли я настраивать несколько контекстов? Один для «реальных» данных, один для справочных данных и один для раскрывающихся списков поиска?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...