2016-08-17 3 views
1

Я использую dapper для сопоставления результатов SQL непосредственно с моим объектом C#, все работает красиво.Как выполнить строгий сопоставление на Dapper

Я использую заявление, как это сделать отображение

результата переменного = connection.Query < MyClass> ("sp_select",);

, но этот оператор, похоже, не обеспечивает точное сопоставление между полями классов и столбцами, возвращаемыми из базы данных. Значит, это не сработает, если поле в POCO не существует в результирующем наборе.

Мне нравится тот факт, что реализация является свободной и не применяет никаких ограничений права на летучую мышь, но есть ли какая-либо особенность dapper, которая позволила бы мне потребовать определенные поля из набора результатов, прежде чем считать успешное отображение ?

ответ

1

Вы также можете попробовать Dapper-Extensions

Вот пример:

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

[TestFixture] 
public class DapperExtensions 
{ 
    private SqlConnection _connection; 

    [SetUp] 
    public void Init() 
    { 
     _connection = new SqlConnection(@"Data Source=.\sqlexpress;Integrated Security=true; Initial Catalog=mydb"); 
     _connection.Open(); 

     _connection.Execute("create table Person(Id int not null, FirstName varchar(100) not null, LastName varchar(100) not null)"); 
     _connection.Execute("insert into Person(Id, FirstName, LastName) values (1, 'Bill', 'Gates')"); 
    } 

    [TearDown] 
    public void Teardown() 
    { 
     _connection.Execute("drop table Person"); 
     _connection.Close(); 
    } 

    [Test] 
    public void Test() 
    { 
     var result = _connection.Get<Person>(1); 
    } 
} 

тест потерпит неудачу из-за отсутствующего Адрес столбца в таблице Person.

Вы также можете игнорировать столбцы с Custom Maps:

public class PersonMapper : ClassMapper<Person> 
{ 
    public PersonMapper() 
    { 
     Map(x => x.Address).Ignore(); 
     AutoMap(); 
    } 
} 
1

Вы не можете принудительно применять это «автоматически» с атрибутом или флагом. Вы можете следить за этим фоном open Github issue.

Это может быть достигнуто путем вы вручную путем отображения каждого свойства самостоятельно в выбранном пункте, хотя в этот момент вы потеряли много силы и простоты использования Dapper.

var result = connection.Query<MyClass>("sp_select") 
         .Select(x => 
         { 
          // manually map each property and verify 
          // that the data is returned 
         }); 
+0

Спасибо за указание на открытый вопрос о GitHub, я был уверен, что кто-то уже просил эту функцию в какой-то момент ... Я просто не получил правильная формулировка в моем поиске. И это имеет смысл, почему они сопротивляются, чтобы добавить функцию быстро. –

Смежные вопросы