Dapper에서 엄격한 매핑을 수행하는 방법

.net c# dapper

문제

내 C # 개체에 직접 SQL 결과 집합을 매핑하는 데 사용하는 dapper, 다 잘 작동합니다.

나는 매핑을하기 위해 이와 같은 문장을 사용하고있다.

var result = connection.Query <MyClass> ( "sp_select",);

하지만이 문은 클래스 필드와 데이터베이스에서 반환 된 열 사이의 정확한 매핑을 시행하는 것 같지 않습니다. 결과, POCO의 필드가 결과 집합에 존재하지 않으면 실패하지 않습니다.

구현이 느슨하고 배트의 제한 권리를 강요하지 않는다는 사실을 즐긴다.하지만 맵핑을 성공으로 판단하기 전에 결과 집합의 특정 필드를 요구할 수있는 기능이 있습니까?

수락 된 답변

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 테이블의 Address 컬럼이 누락되어 테스트가 실패합니다.

맞춤지도로 항목을 무시할 수도 있습니다.

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

인기 답변

속성 또는 플래그를 사용하여 "자동으로"강제 적용 할 수있는 방법은 없습니다. 이 공개 Github 문제 를 더 많은 배경을 따를 수 있습니다.

이것은 여러분이 수동으로 각 속성을 select 절에 매핑하여 수행 할 수 있습니다. 그러나 그 시점에서 Dapper의 많은 기능과 사용 편의성을 잃어 버렸습니다.

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


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow