微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用带有更改跟踪的 Dapper 来保存更改的列表?

如何解决如何使用带有更改跟踪的 Dapper 来保存更改的列表?

我正在将 Dapper 视为我们下一个项目的 ORM,但我不清楚一些事情。

this问题中有关于如何做insertsupdatesdeletes的答案。
由于这个问题已经有点老了,也许现在有更好的方法了..

但我最关心的是如何在列表上执行 ApplyUpdates

假设您有一个 List<Customer>,其构建方式如图所示 here

假设您在 DataGridView 中显示此列表。
现在,用户

  • 改变几行的数据,
  • 插入一些新行,
  • 删除几行

当他点击保存按钮时,此时您想使用 Dapper 将 List<Customer> 中的所有这些更改保存到您的数据库中。

我该怎么做?

如果我必须遍历列表并为每一行调用一个 insert,update or delete 语句,那么我如何确定要使用的操作? deleted 行将从列表中消失。
我还想确保如果一个语句失败,所有语句都将被回滚。
我需要返回并填充 DataGridView 的所有新行的主键。

换句话说,ADO DataAdapter/DataTable 为您所做的一切。

使用 Dapper 执行此操作的最佳方法是什么?

编辑
我现在能想到的最好方法是在内存中保留 3 个列表,当用户更改一些数据时,在 update list添加一行,insert listdeleted list 也是如此,这样我就可以点击按钮浏览这 3 个列表。
但我希望 Dapper 中有更好的替代版本来应对这种情况。

解决方法

你需要自己处理这个,因为 Dapper 不管理它。关于如何做到这一点,有几种理论。

  1. 删除所有项目,然后重新添加。

易于实施。 对 DB 性能不利,实际上每行 2 DB 写入。

  1. 遍历项目并更新而不检查更改

实施起来并不难。

DB 性能优于选项 1,但并不理想。 添加和删​​除比更新更难检测。

  1. 遍历项目并仅在存在差异时进行更新

更难实施。 需要先从 DB 中读取以比较值(额外的 DB 操作)

  1. 将更改存储在单独的列表中

更难实现,因为您需要将列表更新“包装”到另一个类(第一类集合?)并存储更改 对 DB 最有效,因为您只对每个 DB 项执行最少的操作。

最后,您可以根据需要优化的方式为不同的实体选择不同的方法。例如如果您知道只有几个实体并且没有很多更新,则选项 1 很好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?