dapper - 是否有更干净的 Dapper 方法来仅更新随 Dapper 更改的列?

标签 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;
        }
    }

最佳答案

您正在寻找的功能称为更改跟踪。此功能是更大的工作单元模式的一部分。
Dapper 不支持更改跟踪。
很少有 Dapper 的附加组件在不同级别支持这一点。引用 this this比较图表的博客文章。正如图表中提到的,Dapper.Contrib 和 Dapper.Rainbow 以不同的方式支持它。
正如@MarcGravell 在评论中所说,null POCO 属性的值很常见。它并不总是意味着“不更新该字段”。这也可能意味着“将该 DB 字段设置为 null(或 DBNull)”。因为属性值是 null 没有任何保证的含义。 ,大多数 ORM 以与 Dapper 相同的方式实现它。

关于dapper - 是否有更干净的 Dapper 方法来仅更新随 Dapper 更改的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49303407/

相关文章:

orm - Dapper 是否会自动选择匹配属性的列?

oracle - 当我运行带有参数的查询或命令时,为什么 Dapper 会抛出 OracleException?

c# - Dapper 多映射 API splitOn 参数错误 - 我没有使用 MultiMapping

c# - SQLite .net 提供程序和 "prepare statement"功能

.net - Dapper 不会与具有自定义 getter/setter 的成员一起使用吗?

c# - 使用 Async 和 Await 中断数据库调用(使用 Dapper)

sql-server - 在 .NET Core 中的连接字符串之间轻松切换

c# - 在 BeginTransaction() 之后传递 IDbConnection

c# - 简洁的插入语法

asp.net - Dapper:从存储过程映射动态数据透视列