如何确定在更新数据库之前是否在dto中进行了更改?

时间:2016-06-03 13:49:17

标签: c# angularjs entity-framework data-transfer-objects

我想要实现&#34;更改验证器&#34;。 我在后端使用实体框架,在前端使用角度。 通过WebApi进行通信。 由于许多原因,客户端将(new \Exception)->getTraceAsString(); 和其他属性发送给我的控制器。 此列表可以包含许多可以从用户修改的对象。 所以,如果List<DepartmentSettingDto>没有对来自db的数据进行任何更改,我不想更新数据库。 我想要这样的东西:

DepartmentSetting

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

1 个答案:

答案 0 :(得分:1)

扩展方法需要您遍历对象的属性以检查它们是否不同。更好的解决方案是重载Equals(和GetHashCode)并在更新数据库之前测试相等性。请查看this SO post,了解有关如何重载这些方法的详细信息。

如果您可以控制前端,其他一些内容可能会有所帮助。在这种情况下,可能的方法是让前端监视任何属性的更改,这可能会改变并将该标志与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>

这适用于隐藏字段,但是如果在将AJAX请求发送到WebAPI之前基于检查没有更改,则可以将其替换为DTO中的字段,甚至不用打扰Web服务器。 ..