Как определить, были ли внесены изменения в dto перед обновлением базы данных?

0

Я пытаюсь придумать "валидатор изменений". Я использую платформу Entity на back-end и угловой в интерфейсе. Связь через WebApi. По многим причинам клиент отправляет мне List<DepartmentSettingDto> и другие свойства моего контроллера. Этот список может содержать много объектов, которые могут быть не изменены пользователем. Таким образом, я не хочу обновлять базу данных, если DepartmentSetting имеет никаких изменений с данными из db. Я хочу иметь что-то вроде этого:

public void UpdateDepartmentsSettings(DepatmentsSettingsDto depatmentsSettings)
{
    using (var transaction = new TransactionScope(TransactionScopeOption.RequiresNew
        , new TransactionOptions {IsolationLevel = IsolationLevel.Serializable}))
    {
        foreach (var departmentSetting in DepatmentsSettingsDto.DepartmentSettings)
        {
            var currentSetting = _context.DepartmentSettings.Find(departmentSetting.Id)
            if departmentSetting.Modified(currentSetting)
            {
                var newSetting = Mapper.Map<DepartmentSettingDto, DepartmentSetting>
                    (departmentSetting, currentSetting);
                Mapper.Map(currentSetting, newSetting);
            }
        }                
        _context.SaveChanges();
        transaction.Complete();
    }
}

Можно ли написать метод расширения или что-то вроде этого, чтобы избежать сохранения немодифицированных изменений? Заранее спасибо!

  • 1
    Что с угловой меткой?
  • 0
    Возможно, справиться с этим на переднем конце и отправлять только те элементы, которые требуют обновления? stackoverflow.com/questions/17648822/...
Теги:
entity-framework

1 ответ

1

Метод расширения потребует от вас повторения свойств объекта, чтобы проверить, отличаются ли они. Лучшим решением для этого было бы перегрузить EqualsGetHashCode) и просто проверить равенство перед обновлением БД. Проверьте это сообщение SO, чтобы узнать, как перегрузить эти методы.

Что-то еще может быть полезно, если у вас есть контроль над интерфейсом. В этом случае возможный подход состоял бы в том, чтобы внешний вид наблюдал за изменениями любого свойства, которые могли бы изменить и отправить этот флаг вам вместе с DTO. Т.е. поставить класс CSS на все ваши HTML-элементы, где может произойти изменение, и подключить к ним обработчик jQuery. После первого изменения вы можете отсоединить его. Таким образом, вам не нужно даже запрашивать БД для этой конкретной записи, чтобы проверить равенство - просто выполните обновление, если это так говорит интерфейс.

Это то, что я имею в виду:

<input type="hidden" id="isThereChanges" value="false" />

<div>
    <input type="text" class="editor-field" />
    <input type="text" class="editor-field" />
    <input type="checkbox" class="editor-field" />
    <input type="radio" class="editor-field" />
</div>

<script>
    $(document).ready(function() {
        $(".editor-field").on("change", ChangeDetected);
    });

    function ChangeDetected() {
        $(isThereChanges).val(true);
        $(".editor-field").off("change", ChangeDetected);
    }        
</script>

Ну, это работает со скрытым полем, но вы можете заменить его полем в своем DTO или даже не беспокоить веб-сервер, если на основе проверки нет изменений, перед отправкой запроса AJAX в WebAPI...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню