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
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>());
Neden Oracle tablo/sütun/dizin adları ...
Nasıl sqlite3 / sütun adları listesini...
SQL Server: Nasıl bir tablo sütun adla...
Nasıl SQL anahtar kelimeler benzeyen S...
Harita uygular ve ekleme sipariş tutan...