SORU
17 Ocak 2012, Salı


El ile Harita sınıf özellikleri ile sütun adları

Micro ORM Şık yeni duyuyorum. Şu ana kadar basit ORM ilgili maddeleri için kullanabiliyorum ama veritabanı sütun sınıf özellikleri ile adlarını göster için mümkün değil. Örneğin:

Aşağıdaki gibi bir veritabanı tablo var

Table Name: Person
person_id  int
first_name varchar(50)
last_name  varchar(50)

ve sınıfı Kişiyi aradım

public class Person 
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Lütfen tablodaki sütun adları benim sınıf için hangi sorgu sonucu aldığım verileri eşlemek için çalışıyorum özellik adı farklıdır.

var sql = @"select top 1 PersonId,FirstName,LastName from Person";
using (var conn = ConnectionFactory.GetConnection())
{
    var person = conn.Query<Person>(sql).ToList();
    return person;
}

Yukarıdaki kod sütun adları nesnenin (Kişinin) özellikleri ile uyuşmaz gibi çalışmaz. Bu senaryoda, el ile eşleştirmek için Şık (e.yapabileceğim bir şey var g person_id => PersonId) nesne özellikleri ile sütun adları?

Herhangi bir ipucu veya yardım son derece mutluluk duyacağız.

CEVAP
27 EYLÜL 2012, PERŞEMBE


Dapper şimdi özellik mappers için özel sütun destekler. Bu kadar ITypeMap arabirimi üzerinden yapar. ** 18 sınıf bu işi en yapabilecek Dapper tarafından sağlanır. Örneğin:

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

Ve modeli:

public class TModel {
    [Column(Name="my_property")]
    public int MyProperty { get; set; }
}

ÖNEMLİ NOTCustomPropertyTypeMap uygulanması özniteliği ve sütun adları var maç ya da özelliği eşlenen olmayacağını gerektirir.DefaultTypeMap sınıfı standart işlevselliği sağlar ve bu davranışı değiştirmek için kaldıraçlı olabilir:

public class FallbackTypeMapper : SqlMapper.ITypeMap
{
    private readonly IEnumerable<SqlMapper.ITypeMap> _mappers;

    public FallbackTypeMapper(IEnumerable<SqlMapper.ITypeMap> mappers)
    {
        _mappers = mappers;
    }

    public SqlMapper.IMemberMap GetMember(string columnName)
    {
        foreach (var mapper in _mappers)
        {
            try
            {
                var result = mapper.GetMember(columnName);
                if (result != null)
                {
                    return result;
                }
            }
            catch (NotImplementedException nix)
            {
            // the CustomPropertyTypeMap only supports a no-args
            // constructor and throws a not implemented exception.
            // to work around that, catch and ignore.
            }
        }
        return null;
    }
    // implement other interface methods similarly

    // required sometime after version 1.13 of dapper
    public ConstructorInfo FindExplicitConstructor()
    {
        return _mappers
            .Select(mapper => mapper.FindExplicitConstructor())
            .FirstOrDefault(result => result != null);
    }
}

Ve bu, kolay varsa onlar otomatik olarak öznitelikleri kullanır ama aksi halde normal bir davranış döner özel bir tür eşleyici oluşturmak için hale geliyor

public class ColumnAttributeTypeMapper<T> : FallbackTypeMapper
{
    public ColumnAttributeTypeMapper()
        : base(new SqlMapper.ITypeMap[]
            {
                new CustomPropertyTypeMap(
                   typeof(T),
                   (type, columnName) =>
                       type.GetProperties().FirstOrDefault(prop =>
                           prop.GetCustomAttributes(false)
                               .OfType<ColumnAttribute>()
                               .Any(attr => attr.Name == columnName)
                           )
                   ),
                new DefaultTypeMap(typeof(T))
            })
    {
    }
}

Şimdi rahatlıkla öznitelikleri kullanarak: göster gerektiren tür destek anlamına gelir

Dapper.SqlMapper.SetTypeMap(
    typeof(MyModel),
    new ColumnAttributeTypeMapper<MyModel>());

İşte Gist to the full source code.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caroline Saquet

    Caroline Saq

    1 EKİM 2011
  • CrazyMan

    CrazyMan

    14 Mayıs 2008
  • Fullscreen

    Fullscreen

    23 Mart 2006