如何解决如何使用带有更改跟踪的 Dapper 来保存更改的列表?
我正在将 Dapper 视为我们下一个项目的 ORM,但我不清楚一些事情。
在this问题中有关于如何做inserts
、updates
和deletes
的答案。
由于这个问题已经有点老了,也许现在有更好的方法了..
但我最关心的是如何在列表上执行 ApplyUpdates
。
假设您有一个 List<Customer>
,其构建方式如图所示 here
假设您在 DataGridView 中显示此列表。
现在,用户将
- 改变几行的数据,
- 插入一些新行,
- 删除几行
当他点击保存按钮时,此时您想使用 Dapper 将 List<Customer>
中的所有这些更改保存到您的数据库中。
我该怎么做?
如果我必须遍历列表并为每一行调用一个 insert,update or delete
语句,那么我如何确定要使用的操作? deleted
行将从列表中消失。
我还想确保如果一个语句失败,所有语句都将被回滚。
我需要返回并填充 DataGridView 的所有新行的主键。
换句话说,ADO DataAdapter/DataTable 为您所做的一切。
使用 Dapper
执行此操作的最佳方法是什么?
编辑
我现在能想到的最好方法是在内存中保留 3 个列表,当用户更改一些数据时,在 update list
中添加一行,insert list
和 deleted list
也是如此,这样我就可以点击按钮浏览这 3 个列表。
但我希望 Dapper
中有更好的替代版本来应对这种情况。
解决方法
你需要自己处理这个,因为 Dapper 不管理它。关于如何做到这一点,有几种理论。
- 删除所有项目,然后重新添加。
易于实施。 对 DB 性能不利,实际上每行 2 DB 写入。
- 遍历项目并更新而不检查更改
实施起来并不难。
DB 性能优于选项 1,但并不理想。 添加和删除比更新更难检测。
- 遍历项目并仅在存在差异时进行更新
更难实施。 需要先从 DB 中读取以比较值(额外的 DB 操作)
- 将更改存储在单独的列表中
更难实现,因为您需要将列表更新“包装”到另一个类(第一类集合?)并存储更改 对 DB 最有效,因为您只对每个 DB 项执行最少的操作。
最后,您可以根据需要优化的方式为不同的实体选择不同的方法。例如如果您知道只有几个实体并且没有很多更新,则选项 1 很好。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。