Я пытаюсь придумать "валидатор изменений". Я использую платформу 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();
}
}
Можно ли написать метод расширения или что-то вроде этого, чтобы избежать сохранения немодифицированных изменений? Заранее спасибо!
Метод расширения потребует от вас повторения свойств объекта, чтобы проверить, отличаются ли они. Лучшим решением для этого было бы перегрузить Equals
(и GetHashCode
) и просто проверить равенство перед обновлением БД. Проверьте это сообщение 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...