2016-07-06 2 views
1

가 나는 다음과 같은 클래스가 개별 테이블에 매핑 :단정 확장 : 복합 필드 클래스,

public class Publication 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Headline { get; set; } 
    public DateTime Published { get; set; } 
    public ProductContact Contact { get; set; } 
} 

public class ProductContact 
{ 
    public string FullName { get; set; } 
    public string JobTitle { get; set; } 
    public string Email { get; set; } 
} 

그리고이 구조와 관련된 테이블, "출판물"모든 필드가은 (의 속성을 포함 ProductContact). 나는이 프로그램이 예외 발생 (포함 ProductContact 정보)를 발행 행을 삽입하려고하면

: 그래서

System.NotSupportedException: The member Contact of type ProductContact cannot be used as a parameter value 

을, 나는 속성 테이블의 필드에 ProductContact 속성을 매핑 할 매퍼 추가 :

public PublicationMapper() 
    { 
     TableName = "Publications"; 

     Map(x => x.Contact.FullName).Column("ContactFullName"); 
     Map(x => x.Contact.JobTitle).Column("ContactJobTitle"); 
     Map(x => x.Contact.Email).Column("ContactEmail"); 

     AutoMap(); 
    } 

이 매퍼를 사용하면 동일한 예외가 발생합니다.

System.Data.SqlClient.SqlException (0x80131904): Must declare the scalar variable "@FullName". 
:

그런 다음, 나는이 경우 삽입 문

  Map(x => x.Contact).Ignore(); 

에서이 요소를 포함하지 않도록 말끔에게, 연락처 필드에 문을 무시 추가, 나는 다른 예외를 얻을

Dapper가이 속성을 완전히 무시하고 이전 단계에서 추가 한 매핑이 효과가 없음을 나타냅니다.

ProductContact 속성을 테이블 필드에 매핑하는 방법이 있습니까?

감사합니다.

+0

왜 익명의 클래스가 아닌'new {pub.Id, pub.Title, ......, ContactFullName = pub.Contact.FullName, ContactJobTitle = pub.Contact.JobTitle, ContactEmail = pub.Contact.Email }'? 'ContactFullName'이 실제로는 SQL의 매개 변수 이름과 일치시키기 위해 실제로는'FullName'이어야합니다. SQL과 완전한 Dapper 호출을 보여 주면 도움이 될 것입니다. – juharr

+0

그럴 수 없다는 것은 유감 스럽다. Dapper가 코드와 사용 편의성을 줄이는 데 도움이되는 방법임을 관리자에게 보여 주려고 정확한 위치에 자리 잡았습니다. 특히 개체와 해당 데이터의 이름이 다른 경우 아 잘 – zerohero

답변

2

DapperExtensions에서는 가능하지 않다고 생각합니다. one of their issues에서

, 그들은

는 현재 우리가 중첩 된 객체를 지원 할 계획되지 않습니다 말한다. 그러나 은

내가 접근법과 다른 매핑 클래스의 다양한 시도 어디서나 얻을 수 중첩 된 개체 위에 건너 뛰는 허용됩니다 자신의 매퍼 만들 수 있습니다 - 내가 생각하지 않습니다를 그들 중첩 된 속성 값 을 매핑하여 속성 자체를 무시하도록 지원합니다 (완료되지 않은 경우 "매개 변수 값으로 사용할 수 없음"오류 발생).

하나의 접근법은 (질문에 @juharr이 제안한 것처럼) 익명 클래스로 객체를 평평하게 만드는 것입니다. 또 다른 접근법은 AutoMapper와 같은 것을 사용하여 복잡한 객체를 병합 된 삽입 모델로 병합하는 것입니다 .