Dapper .Net : 테이블 열과 모델 속성 유형 불일치

dapper

문제

실제로 나는 (예 : 주소에 대한) 형식 개체의 속성을 포함하는 그 테이블에 대한 varchar하지만 도메인 모델의 ex.Address에 대한 컬럼을 포함하는 결과를 반환하는 쿼리를 가지고 있습니다. 그 때문에 그것은 캐스팅 할 수 없다는 오류를 발생시킵니다. comment.I이 문제를 해결하는 방법을 알아낼 수 없습니다. 닷넷.

코드 스 니펫 :

IEnumerable<Account> resultList = conn.Query<Account>(@"
                    SELECT * 
                    FROM Account
                    WHERE shopId = @ShopId", 
new {  ShopId = shopId });

Account 개체는 예를 들어 있습니다.

public class Account {
  public int? Id {get;set;}
  public string Name {get;set;}
  public Address Address {get;set;}
  public string Country {get;set;}
  public int ShopId {get; set;}
}

데이터베이스 테이블 열 (Address)과 도메인 모델 속성 (Address) 사이에 형식이 일치하지 않으므로 dapper가 exception.So를 throw합니다. 따라서 dapper를 통해 해당 속성을 매핑 할 수있는 방법이 있습니다.

수락 된 답변

POCO와 데이터베이스 사이에는 형식이 일치하지 않으므로 둘 사이의 매핑을 제공해야합니다.

public class Account {
  public int? Id {get;set;}
  public string Name {get;set;}
  public string DBAddress {get;set;}
  public Address Address 
  {
   // Propbably optimize here to only create it once.
   get { return new Address(this.DBAddress); } 
  }

  public string Country {get;set;}
  public int ShopId {get; set;}
}

뭐 그런 - 당신이 속성에 DB 컬럼과 일치 DBAddress (당신이 좋아하는 별칭 제공해야 SELECT Address as DBAddress 와에 get 메소드를 제공하는 대신 *의를) Address / 생성 객체의 유형 재사용 Address 의 내용을 db 값.


인기 답변

또 다른 옵션은 Dapper의 다중 매핑 기능을 사용하는 것입니다.

public class TheAccount
{
    public int? Id { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }
    public string Country { get; set; }
    public int ShopId { get; set; }
}

public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
}

public class Class1
{
    [Test]
    public void MultiMappingTest()
    {
        var conn =
            new SqlConnection(
                @"Data Source=.\SQLEXPRESS; Integrated Security=true; Initial Catalog=MyDb");
        conn.Open();

        const string sql = "select Id = 1, Name = 'John Doe', Country = 'USA', ShopId = 99, " +
                           " Street = '123 Elm Street', City = 'Gotham'";

        var result = conn.Query<TheAccount, Address, TheAccount>(sql, 
            (account, address) =>
                {
                    account.Address = address;
                    return account;
                }, splitOn: "Street").First();

        Assert.That(result.Address.Street, Is.Not.Null);
        Assert.That(result.Country, Is.Not.Null);
        Assert.That(result.Name, Is.Not.Null);
    }
}

필자가 볼 수있는 유일한 문제는 splitOn이 작동하도록하기 위해 Select 문에있는 Address 필드 다음에 Account 필드를 모두 나열해야한다는 것입니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.