Dapper no puede pasar los datos a la base de datos

c# dapper model-view-controller

Pregunta

Tengo un problema donde no puedo insertar ni actualizar a la base de datos. Estoy usando Dapper y estoy usando una clase anidada para el modelo en el que quiero pasar los datos.

Tengo un error que es:

The member Information of type TestProject.Models.Information cannot be used as a parameter value

Mi modelo está abajo:

public class Member
{
    [Required]
    public string Username { get; set; }
    [Required]
    public string Password { get; set; }
    [Required]
    public string Information MemberInfo { get; set; }
}

public class Information
{
    [Required]
    public string Email { get; set; }
    [Required]
    public string City { get; set; }
    [Required]
    public string State { get; set; }
    [Required]
    public DateTime BirthDate { get; set; }
}

Y mi controlador está a continuación:

public IHttpActionResult SetMemberInfo(Member models)
{
    using (TransactionScope trans = new TransactionScope())
    using (IDbConnection conn = new SqlConnection(GetConnection()))
    {
        conn.Open();

        int rowsAffected = conn.Execute("MemberInformation", models, commandType: CommandType.StoredProcedure);

        trans.Complete();

        return rowsAffected;
    }

    return Ok();
}

Mi procedimiento almacenado está a continuación:

ALTER PROCEDURE dbo.[MemberInformation]
(
    @Username   NVARCHAR(100),
    @Password   NVARCHAR(100),
    @Email      NVARCHAR(100),
    @City       NVARCHAR(100),
    @State      NVARCHAR(100),
    @BirthDate  DATETIME
)
AS
BEGIN
 // TODO: Do something with the data
END

Y paso los datos al controlador desde el lado del cliente están a continuación:

var models = {
    "Username": "MyUsername",
    "Password": "MyPassword",
    "MemberInfo": {
        "Email": "MyEmail",
        "City": "MyCity",
        "State": "MyState",
        "BirthDate": "2017-08-23"
    }
};

$.ajax({
                type: "POST",
                contentType: "application/json",
                url: "http://localhost/SetMemberInfo",
                data: JSON.stringify(models),
                dataType: "json",
                success: function (data) {
                    window.location.reload();
                },
                error: function (response) {
                    console.log(JSON.stringify(response));
                }
            });

Pero si no llegué a la clase anidada (significa que todos los datos de la clase Información se movieron a la clase Miembro), todo funciona bien.

¿Cómo puedo decirle a dapper que separe los datos de la clase anidada y la divida en una sola clase, aunque en el nivel de la aplicación sea una clase anidada?

¿O hay otras soluciones para esto?

Tu respuesta muy apreciada.

Gracias

Respuesta aceptada

Bueno, no creo que Dapper tenga este tipo de soporte para objetos anidados como parámetros.

Lo que puedes probar es:

  1. Cree un DTO exactamente como espera su procedimiento almacenado y asigne su objeto Miembro a este nuevo tipo.
public class MemberInformationParameter
{
    public MemberInformationParameter(Member member)
    {
            Username = member.Username;
            Password = member.Password;
            Email = member.MemberInfo.Email;
            City = member.MemberInfo.City;
            State = member.MemberInfo.State;
            BirthDate = member.MemberInfo.BirthDate;
    }

    public string Username { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public DateTime BirthDate { get; set; }
}
  1. O simplemente pasa los argumentos como un objeto dinámico con la sintaxis:

    conn.Execute ("MemberInformation", new {Property1: value1, Property2: value2}, commandType: CommandType.StoredProcedure);



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é