Mapper des colonnes SQL dans SqlMapper.Query aux propriétés de classe

dapper dapper-extensions join mapping

Question

D'abord, je n'ai pas beaucoup d'expérience avec dapper.net et peut-être que ce problème a une solution simple.

Je voudrais utiliser des fonctionnalités multi-cartographie.

J'ai simplifié mon problème.

J'ai 2 tables.

Première table

DES VOITURES

Colonnes:

  • CARD_ID (PK)
  • CAR_LOCATION
  • CAR_STATUS

Deuxième table

MARQUES

Colonnes:

  • ID (PK)
  • CARD_ID (FK)
  • MARQUE
  • LOGO DE LA MARQUE

J'ai besoin d'exécuter cette requête:

SQL_CMD:

SELECT * FROM CARS
LEFT JOIN BRANDS
ON CARS.CARD_ID = BRANDS.CARD.ID;

Dans l'application .NET, je mappe ces tables sur 2 classes POCO.

public class Car
{
  public int CarId {get;set}
  public string CarLocation {get;set;}
  public string CarStatus {get;set;} 
  public Brand Brand {get;set;}
}

public class Brand
{
  public int Id {get;set}
  public int CardId {get;set;}
  public string BrandName {get;set;}
  public string BrandLogo {get;set;}
}

Lorsque j'interroge sql cmd ci-dessus:

        var data = connection.Query<Car, Brand, Car>(SQL_CMD, (car, brand) =>
        {
            car.Brand = brand;
            return car;

        }, commandTimeout: 50000, splitOn:"ID")

J'ai un résultat vide.

Le problème à mon humble avis réside dans le mappage des colonnes SQL sur les propriétés de classe car si j'ai modifié prop Card.CarId en Car.CAR_ID, ces propriétés sont remplies.

Est-il possible de mapper les "colonnes SQL" aux propriétés de classe dans SqlMapper.Query<T1,T2,TReturn> aux propriétés de classe?

Je sais qu'il existe ClassMapper mais je n'ai pas trouvé comment l'utiliser dans ce scénario.

Merci

ÉDITÉ:

J'ai essayé d'ajouter des classes de mappage, mais pas de travail

public class CarMapper : ClassMapper<Car>
{
   Table("CARS");
   Map(c=>c.CarId).Column("CAR_ID").KeyType(KeyType.Assigned);
   Map(c=>c.CarLocation).Column("CAR_LOCATION");
   Map(c=>c.CarStatus).Column("CAR_STATUS");
}

public class BrandMapper : ClassMapper<Brand>
{
   Table("BRANDS");
   Map(c=>c.Id).Column("ID").KeyType(KeyType.Assigned);
   Map(c=>c.CarId).Column("CAR_ID");
   Map(c=>c.BrandName).Column("BRAND_NAME");
   Map(c=>c.BrandLogo).Column("BRAND_LOGO");
}

ajouter des assemblages de mappage

DapperExtensions.DapperExtensions.SetMappingAssemblies(new List<Assembly>
{
    Assembly.GetAssembly(typeof(CarMapper)), 
    Assembly.GetAssembly(typeof(BrandMapper)),                                                         
});

et après cette configuration, exécutez la requête

    var data = connection.Query<Car, Brand, Car>(SQL_CMD, (car, brand) =>
    {
        car.Brand = brand;
        return car;

    }, commandTimeout: 50000, splitOn:"ID")

Comme je l'ai dit, pas de travail, les propriétés des objets sont vides mais si j'ai essayé d'insérer, de mettre à jour ou de supprimer, cela fonctionne.

Je suis confus maintenant où peut être la racine du problème.

Réponse populaire

Dapper Extensions fournit 4 extensions: Get, Insert, Update et Delete, donc votre deuxième exemple ne fonctionnera pas. L'extension de requête fait partie du noyau Dapper. Pour autant que je sache, Dapper Extensions ne prend pas en charge le multi-mapping.

La seule option à laquelle je peux penser consiste à modifier votre instruction select et à renommer les attributs, par exemple:

SELECT CAR_ID as CarId, CAR_LOCATION as CarLocation, CAR_STATUS as CarStatus, etc.
FROM CARS
LEFT JOIN BRANDS
ON CARS.CARD_ID = BRANDS.CARD.ID

Ensuite, le multi-mapping devrait fonctionner.

De plus, vous n'avez pas besoin de spécifier splitOn si vous divisez par ID. Dapper se sépare automatiquement dans les champs Id.

Dapper suppose que vos colonnes Id sont nommées "Id" ou "id", si votre clé primaire est différente ou si vous souhaitez diviser la ligne large au point autre que "Id", utilisez le paramètre facultatif "splitOn".



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