为什么向 Dapper 添加“字段更改跟踪”是好主意还是坏主意?

Ezi*_*nze 7 .net c# entity-framework dapper .net-core

我们在我们的应用程序中使用DapperDapper.Contrib。我们选择Dapper它是因为它更快,而且由于负载较重,速度对我们来说就是一切。现在看来“更改字段跟踪”对我们来说至关重要。现在Dapper.Contrib创建update始终设置所有字段的查询,这样的查询会使它们变慢。一些表现在有大约 30 列,并且完全更新该表中的行效率非常低。

据我所知,Dapper.ContribChange tracking per object,但Change tracking per field没有被引入图书馆。

我非常仔细地进行了研究,发现该领域还没有开展任何工作。那个不幸的研究让我感到困惑。我想听听您的想法:

  1. 如果这样的扩展没有实现,那么它可能没有用吗?我在这里缺少什么?
  2. 请设身处地为我着想。你会怎么办?迁移到 EF 或向 Dapper.Contrib 引入“Chnage 跟踪”?
  3. 可能添加这样的功能会使 Dapper 变慢,这就是为什么该功能尚未实现?

Rob*_*vey 4

Get如果您使用和Update方法,并且您将Update使用 检索到的同一对象(在对其进行更改之后)交给Dapper.Contrib,则 Dapper.Contrib 可以进行更改跟踪Get

每个字段的更改跟踪无关紧要。更改一个字段,您仍然需要写入整个记录。

如果您确实只想更改一个字段(或两个...)而不产生写入整个记录的成本,则必须执行以下操作:

conn.Execute(
    @"UPDATE MyTable SET MyField=@myParameter WHERE ID = @id",
    new { myParameter = myNewValue, id=myID });
Run Code Online (Sandbox Code Playgroud)

注意:您可能会在此处找到对每个字段更改跟踪的支持。它不在 Dapper 中,因为:

这不是我们想要与 Dapper 合作的方向。如果您想要对对象进行完整的更改跟踪或更新,我会推荐一种 ORM,它接受与更改跟踪相关的这些额外成本,例如实体框架。这不是我们想要的核心 Dapper 库中的东西。——尼克·克拉弗

  • [Nick Craver 的评论](https://github.com/StackExchange/Dapper/pull/1204#issuecomment-474336654) 在我链接的那篇文章中似乎很有洞察力:*“我想说感谢您的贡献,但这不是我们想要 Dapper 的方向。如果您想要对象的完整更改跟踪或更新,我会推荐一种 ORM,它接受与实体框架等更改跟踪相关的额外成本。这不是我们在核心 Dapper 库中想要的东西."* (4认同)