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

  • Caina Mondo Zine

    Caina Mondo

    13 EKİM 2007
  • Elliot Davin

    Elliot Davin

    28 Kasım 2008
  • Epic Tutorials for iPhone, iPad and iOS

    Epic Tutoria

    18 EYLÜL 2011