Dapper.NET Mappature personalizzate

Esempio

Se i nomi delle colonne delle query non corrispondono alle tue classi, puoi configurare i mapping per i tipi. Questo esempio dimostra la mappatura utilizzando System.Data.Linq.Mapping.ColumnAttribute e una mappatura personalizzata.

Le mappature devono essere configurate solo una volta per tipo, quindi impostarle all'avvio dell'applicazione o da qualche altra parte in cui vengono inizializzate solo una volta.

Assumendo di nuovo la stessa query dell'esempio uno a molti e le classi refactored verso nomi migliori come:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Born { get; set; }
    public Country Residience { get; set; }
    public ICollection<Book> Books { get; set; }
}

public class Country
{
    [System.Data.Linq.Mapping.Column(Name = "CountryId")]
    public int Id { get; set; }

    [System.Data.Linq.Mapping.Column(Name = "CountryName")]
    public string Name { get; set; }
}

public class Book
{
    public int Id { get; set; }

    public string Name { get; set; }
}

Nota come Book non si basa su ColumnAttribute ma dovremmo mantenere la dichiarazione if

Ora posiziona questo codice di mappatura da qualche parte nell'applicazione in cui viene eseguito solo una volta:

Dapper.SqlMapper.SetTypeMap(
    typeof(Country),
    new CustomPropertyTypeMap(
        typeof(Country),
        (type, columnName) =>
            type.GetProperties().FirstOrDefault(prop =>
                prop.GetCustomAttributes(false)
                    .OfType<System.Data.Linq.Mapping.ColumnAttribute>()
                    .Any(attr => attr.Name == columnName)))
);


var bookMap = new CustomPropertyTypeMap(
    typeof(Book),
    (type, columnName) =>
    {
        if(columnName == "BookId")
        {
            return type.GetProperty("Id");
        }

        if (columnName == "BookName")
        {
            return type.GetProperty("Name");
        }

        throw new InvalidOperationException($"No matching mapping for {columnName}");
    }        
);
Dapper.SqlMapper.SetTypeMap(typeof(Book), bookMap);

Quindi la query viene eseguita utilizzando uno degli esempi precedenti Query<> .

In questa risposta viene mostrato un modo più semplice per aggiungere i mapping.