Comment faire pour insérer avec un FK qui est un objet dans Dapper?

.net dapper

Question

J'ai un objet, Ticket , qui possède une propriété de type User . Dans la base de données, la table Ticket contient un FK dans la table User . Existe-t-il un moyen simple de transmettre l' ID de l'utilisateur assigné sur le ticket à une requête?

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

Ce qui précède ne fonctionne pas car newTicket.AssignedTo est un objet User , mais ce dont j'ai besoin est de stocker l' ID de l'utilisateur. Existe-t-il un moyen de le faire avec Dapper?

Réponse acceptée

Je recommanderais de diviser cette fonctionnalité en deux fonctions. L'une consiste à insérer des données dans la table des tickets et à renvoyer la dernière identité. La seconde fonction consiste à récupérer l'enregistrement en utilisant cet identifiant.

Remarque : Dans votre fonction existante, vous avez passé le paramètre de manière incorrecte. Vous pouvez faire quelque chose comme ça avec votre fonction existante -

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

Mais il n'est pas nécessaire d'exécuter à nouveau la requête select si je suppose que vous ne voulez que 2 champs Id et AssignedTo . Donc, dans ce cas, vous pouvez assigner un nouvel identifiant à votre objet newTicket existant, comme ceci -

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
}

bonne chance...



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi