0

我试图想出实现“更改验证器”。我在后端使用实体框架,在前端使用角度。通过 WebApi 进行通信。出于多种原因,客户将我List<DepartmentSettingDto>和其他属性发送给我的控制器。该列表可以包含许多用户无法修改的对象。DepartmentSetting所以,如果数据库中的数据没有变化,我不想更新数据库。我想要这样的东西:

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();
    }
}

是否可以编写扩展方法或类似的方法来避免保存未修改的更改?提前致谢!

4

1 回答 1

1

扩展方法将要求您遍历对象的属性以检查它们是否不同。一个更好的解决方案是重载Equals(and GetHashCode) 并在更新数据库之前测试是否相等。查看此 SO 帖子以获取有关如何重载这些方法的详细信息。

如果您可以控制前端,其他东西可能会有所帮助。在这种情况下,可能的方法是让前端监视任何可能更改的属性的更改,并将该标志与 DTO 一起发送给您。即在所有可能发生变化的 HTML 元素上放置一个 CSS 类,并将 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 中的字段,或者如果没有更改,则甚至不打扰 Web 服务器,基于检查,就在您将 AJAX 请求发送到 WebAPI 之前...

于 2016-06-03T16:04:53.877 回答