¿Cómo insertar con un FK que es un objeto en Dapper?

.net dapper

Pregunta

Tengo un objeto, Ticket , que tiene una propiedad de tipo User . En la base de datos, la tabla Ticket tiene un FK en la tabla User . ¿Existe una manera fácil de pasar la identificación del usuario asignado en el ticket a una consulta?

public class Ticket
{
    public int Id{get;}
    public User AssignedTo{get;set;}
}
public class User
{
    public int Id{get;}
}
public Ticket Save(Ticket newTicket)
{
    var sql = 
       @"
        Declare @localId int
        Insert into Ticket (AssignedTo)
        Values (@AssignedTo)

        Select @localId = CAST(SCOPE_IDENTITY() as int)

        Select
             Id
            ,AssignedTo
        From Ticket
        Where Id = @localId";
    var this.connection.Query<Ticket>(sql, newTicket);           
}

Lo anterior no funciona porque newTicket.AssignedTo es un objeto User , pero lo que necesito es almacenar el ID del usuario. ¿Hay alguna forma de hacerlo compatible con Dapper?

Respuesta aceptada

Yo recomendaría dividir esta funcionalidad en dos funciones. Una de ellas es insertar datos en la tabla Ticket y devolver la última identidad y la segunda función es recuperar el registro utilizando esa identificación.

Nota : En su función existente, ha pasado el parámetro de forma incorrecta. Puede hacer algo como esto con su función existente:

public Ticket Save(Ticket newTicket)
{
    string sql = string.Empty;
    sql = 
       @"
        Insert into Ticket (AssignedTo)
        Values (@AssignedTo);

        SELECT CAST(SCOPE_IDENTITY() as int);";

    var id = this.connection.Query<int>(sql, new { AssignedTo = newTicket.AssignedTo}).Single(); 

    sql = @"Select Id, AssignedTo
                From Ticket
                Where Id = @localId";
     return this.connection.Query<Ticket>(sql, new { localId = id }).Single();
}

Pero no es necesario ejecutar la consulta de selección nuevamente si asumo que desea solo 2 campos Id y AssignedTo . Entonces, en ese caso, lo que puede hacer es asignar ID recién generado a su objeto existente newTicket , así:

public Ticket Save(Ticket newTicket)
{
    string sql = string.Empty();
    sql = 
       @"
        Insert into Ticket (AssignedTo)
        Values (@AssignedTo);

        SELECT CAST(SCOPE_IDENTITY() as int);";

    var id = this.connection.Query<int>(sql, new { AssignedTo = newTicket.AssignedTo}).Single(); 

    // Assign the last identity value to the ID proerpty of newTicket object
    newTicket.Id = id;

    // Return the existing object
    return newTicket
}

buena suerte...



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é