¿Hay alguna manera más limpia de actualizar solo las columnas que cambiaron con Dapper?

dapper

Pregunta

Estoy buscando una manera de actualizar solo establecer propiedades en Dapper. es decir, actualice la propiedad de una Entidad solo si no es nula.

Estoy resolviendo el mismo problema con un enfoque bastante crudo, como se muestra a continuación, pero creo que debería haber una manera más clara y pulcra de hacerlo.

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

Respuesta popular

La función que está buscando se llama Seguimiento de cambios. Esta característica es parte de un patrón más grande de Unidad de trabajo.

Dapper no es compatible con Change Tracking.

Hay pocos complementos de Dapper que apoyen esto en diferentes niveles. Consulte esta publicación en el blog para obtener un cuadro de comparación. Como se menciona en el cuadro, Dapper.Contrib y Dapper.Rainbow lo admiten de diferentes maneras.

Editar: Para responder a tu comentario

Como dijo @MarcGravell en el comentario, null valores null para las propiedades de POCO son comunes. No siempre significa "no actualizar ese campo". Eso también puede significar "establecer ese campo DB en null (o DBNull )". Como no hay un significado garantizado para el valor de propiedad null , la mayoría de los ORM lo implementan de la misma manera que Dapper.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué