是否有更简洁的 Dapper 方法来仅更新随 Dapper 更改的列?

oli*_*son 3 dapper

我正在寻找一种方法来仅更新 Dapper 中的设置属性。即仅当实体的属性不为空时才更新实体的属性。

我正在用一种相当粗糙的方法解决同样的问题,如下所示,但我相信应该有一种更简洁的方法来做到这一点。

 public void UpdateCustomer(Customer cust)
    {
        try
        {
            StringBuilder sb = new StringBuilder("UPDATE CUSTOMER_SETUP  SET DATE_MODIFIED = @DATE_MODIFIED ");
           if(cust.BUSINESSNAME != null) sb.Append(",BUSINESSNAME = @BUSINESSNAME ");
            if (cust.BUSINESS_ADDRESS != null) sb.Append(",BUSINESS_ADDRESS = @BUSINESS_ADDRESS ");
            if (cust.CONTACT_NAME != null) sb.Append(",CONTACT_NAME = @CONTACT_NAME ");
            if (cust.CONTACT_TITLE != null) sb.Append(",CONTACT_TITLE = @CONTACT_TITLE ");
            if (cust.CONTACT_PHONE1 != null) sb.Append(",CONTACT_PHONE1 = @CONTACT_PHONE1 ");
            if (cust.CONTACT_PHONE2 != null) sb.Append(",CONTACT_PHONE2 = @CONTACT_PHONE2 ");
            if (cust.CONTACT_EMAIL != null) sb.Append(",CONTACT_EMAIL = @CONTACT_EMAIL ");
            if (cust.CONTACT_URL != null) sb.Append(",CONTACT_URL = @CONTACT_URL ");
            if (cust.DATE_CREATED != null) sb.Append(",DATE_CREATED = @DATE_CREATED ");
            if (cust.CUSTOMER_TYPE != null) sb.Append(",CUSTOMER_TYPE = @CUSTOMER_TYPE ");
            if (cust.SUBSCRIPTION_TYPE != null) sb.Append(",SUBSCRIPTION_TYPE = @SUBSCRIPTION_TYPE ");


            sb.Append("WHERE ID = @ID ");
            sb.Append("; SELECT CAST(SCOPE_IDENTITY() as int ");

            var sql = sb.ToString();


            using (connection = new SqlConnection(connectString))
            {
                connection.Execute(sql, cust);

            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Ami*_*shi 5

您正在寻找的功能称为更改跟踪。此功能是更大的工作单元模式的一部分。

Dapper 不支持更改跟踪。

很少有 Dapper 的附加组件在不同级别支持这一点。请参阅 博客文章对比图。正如图表中提到的,Dapper.Contrib 和 Dapper.Rainbow 以不同的方式支持它。

正如@MarcGravell 在评论中所说,nullPOCO 属性的值很常见。它并不总是意味着“不更新该字段”。这也可能意味着“将该 DB 字段设置为null(或DBNull)”。由于属性值 is 没有任何保证的含义,因此null大多数 ORM 以与 Dapper 相同的方式实现它。

  • 这本身并不是完整的变更跟踪。更改跟踪需要比较实体的值以查看是否有任何更改。这以某种方式加载了旧状态。我正在寻找的功能是一个更简单的版本......只更新实体的非空属性。 (3认同)