2016-06-03 9 views
0

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

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

Что с угловым тегом? – ryanyuyu

+0

Возможно, справитесь с этим на передней панели и отправьте только те предметы, которые нуждаются в обновлении? http://stackoverflow.com/questions/17648822/how-to-save-rows-in-a-grid-that-i-made-a-change-to –

ответ

1

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

Что-то еще может быть полезно, если у вас есть контроль над интерфейсом. В этом случае возможный подход состоял бы в том, чтобы внешний вид наблюдал за изменениями какого-либо имущества, которые могли бы изменить и отправить этот флаг вам вместе с 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 ...