Ordnen Sie SQL-Spalten in SqlMapper.Query zu zu Klasseneigenschaften

dapper dapper-extensions join mapping

Frage

Zuerst habe ich nicht viel Erfahrung mit dapper.net und vielleicht hat dieses Problem eine einfache Lösung.

Ich möchte Multi-Mapping-Funktionen verwenden.

Ich habe mein Problem vereinfacht.

Ich habe 2 Tische.

Erste Tabelle

AUTOS

Säulen:

  • CARD_ID (PK)
  • CAR_LOCATION
  • CAR_STATUS

Zweiter Tisch

Marken

Säulen:

  • ID (PK)
  • CARD_ID (FK)
  • MARKENNAME
  • MARKENLOGO

Ich muss diese Abfrage ausführen:

SQL_CMD:

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

In .NET-Anwendung mappe ich diese Tabellen auf 2 POCO-Klassen.

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

Wenn ich sql cmd abfrage:

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

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

Ich bekomme ein leeres Ergebnis.

IMHO Problem ist beim Zuordnen von SQL-Spalten auf Klasseneigenschaften, denn wenn ich Prop Card.CarId zu Car.CAR_ID geändert habe, ist diese Eigenschaft gefüllt.

Gibt es eine Möglichkeit, "SQL-Spalten" Klasseneigenschaften in SqlMapper.Query<T1,T2,TReturn> zu Klasseneigenschaften SqlMapper.Query<T1,T2,TReturn> ?

Ich weiß, dass ClassMapper existiert, aber ich habe in diesem Szenario keinen Weg gefunden.

Vielen Dank

BEARBEITET:

Ich habe versucht, Mapping-Klassen hinzuzufügen, aber nicht funktionieren

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

Hinzufügen von Zuordnungsassemblys

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

und nach dieser Einrichtung führen Sie die Abfrage aus

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

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

Wie ich sagte, nicht arbeiten nicht arbeiten Eigenschaften von Objekten sind leer, aber wenn ich versuchte, einfach einfügen, aktualisieren oder löschen es funktioniert.

Ich bin jetzt verwirrt, wo Wurzel des Problems sein kann.

Beliebte Antwort

Dapper Extensions bietet 4 Erweiterungen: Holen, Einfügen, Aktualisieren und Löschen, so dass Ihr zweites Beispiel nicht funktioniert. Query Extension ist ein Teil von Core Dapper. Soweit ich das beurteilen kann, unterstützt Dapper Extensions kein Multi-Mapping.

Die einzige Option, die ich mir vorstellen kann, ist, dass Sie Ihre SELECT-Anweisung ändern und die Attribute umbenennen, zum Beispiel:

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

Dann sollte Multi-Mapping funktionieren.

Außerdem müssen Sie splitOn nicht angeben, wenn Sie nach ID teilen. Dapper teilt automatisch ID-Felder auf.

Dapper geht davon aus, dass Ihre ID-Spalten den Namen "ID" oder "ID" haben. Wenn Ihr Primärschlüssel anders ist oder Sie die breite Zeile an einem anderen Punkt als "ID" aufteilen möchten, verwenden Sie den optionalen Parameter 'splitOn'.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum