2014-02-05 1 views
1

FluentNHibernate를 자동 매핑 및 규칙과 함께 사용하여 데이터베이스를 만듭니다. 아래 그림과 같이 Person, Address 및 Job이라는 3 개의 테이블이 있습니다.Fluent nHibernate - ViewModel에 엔티티 병합

//Database table 
    public class Person() 
    { 
    public virtual int Id { get; set; } 
    public virtual string FirestName { get; set; } 
    public virtual string SecondName { get; set; } 

    public virtual PersonAddress Address { get; set; } 
    public virtual PersonJob Job { get; set; } 
    } 

    //Database table 
    public class PersonAddress() 
    { 
    public virtual int Id { get; set; } 
    public virtual string AddressLine1 { get; set; } 
    public virtual string AddressLine2 { get; set; } 
    public virtual string AddressLine3 { get; set; } 
    } 

    //Database table 
    public class PersonJob() 
    { 
    public virtual int Id { get; set; } 
    public virtual int Description { get; set; } 
    } 

아래의 병합 뷰 모델을 사용하여 그리드에 Person 세부 정보 목록을 표시하려고합니다. 데이터베이스 테이블이 아니더라도 ViewModelPerson에 대한 매핑을 만들어야합니까 (오토 맵핑이 이에 영향을줍니다). 또는 nHibernate 쿼리를 사용하여 ViewModelPerson 엔터티 목록을 생성해야합니까?

//NOT database table - only used as ViewModel 
    public class ViewModelPerson() 
    { 
    public virtual int PersonId { get; set; } 
    public virtual string FirestName { get; set; } 
    public virtual string SecondName { get; set; } 

    //AddressLine1 + AddressLine2 + AddressLine3 
    public virtual int AddressId { get; set; } 
    public virtual string Address { get; set; } 

    public virtual int JobId { get; set; } 
    public virtual string Job { get; set; } 
    } 

답변

1

내가 당신에게 내보기, 내가 믿고 않는 방법 ...

데이터 레이어를 제공하자 - Table 관련 데이터 층은Entity매핑. 이것은 NHibernate와 같은 ORM 도구로부터 나중에 이익을 얻는 방법 일뿐입니다. 모든 CRUD 작업은 매핑을 반영하여 생성됩니다.

프리젠 테이션 계층 - ViewModelEntity(-ies)Client View에 "지도"를 우리에게 도움이 될 것입니다. 따라서 많은 간단한 시나리오에서 Entity, Table, ViewModel .. (예 : Country 또는 Currency)이 1-1과 일치하므로보다 복잡한 시나리오에서 다르게 처리 할 준비가되었습니다.

위의 시나리오 하나의보기에 사람, 주소, 작업을 표시하는 것은 복잡한 작업입니다. 우리는 별거에서 이익을 얻을 수 있습니까? ViewModel의 간접 작성?

제안 : 기본 비즈니스 모델

내가 볼 첫 번째 혜택에 쿼리를 사용하여 서비스 층에 ViewModel 채우기 ViewModelPerson인구은 우리의 손에 있다는 것이다. 매핑 내부에서 고정되어 있지 않습니다. 우리는 데이터 를 (더 적은 데이터를로드 할 계획을 사용) 그리고 우리는 심지어 (일부 코드 목록에서 부하시)이 을 확장 할 수의 양을 줄일 수 있습니다

두 번째 이점은 우리가 필요가 뭔가를 변경 할 경우이다 , 예. Addresses의 비동기 로딩을 소개합니다. 은 서비스 레이어 UP (MVC 컨트롤러, 모델 및 뷰)에서으로 변경해야합니다. 데이터 레이어 (매핑은 변경되지 않음)

+0

응답 해 주셔서 감사합니다. ViewModel on the Service layer 나는 최고의 쿼리 나 메소드에 대해 확신하지 못했습니다. 나는 정상적인 nHibernate 쿼리를 사용하고 AutoMapper를 사용하여 쿼리 결과에서 내 ViewModel을 채 웁니다. 이상적으로는 프로젝션을 사용하고 싶지만 경험이 없으므로 쿼리가 다소 복잡해졌습니다. 예를 들어, ViewModel에서 Address를 연결하는 것은 문제가있었습니다. – gisWeeper

+0

알겠습니다. 하지만 NHibernate를 사용하면 다른 방법이 없습니다. 배우십시오;) 이것들은 여러분이 실험을 시작할 수있는 최상의 링크입니다 *. 검색어, 예상 음향, 변압기로 게임을 시작하면 ** 여기서 주저하지 않고 ** 답장을 보내 드리겠습니다. 그래서 : * 15. 조건 쿼리 * - http://nhforge.org/doc/nh/en/index.html#querycriteria 및 더욱 안전한 유형 * 16.QueryOver Queries * http://nhforge.org/doc/nh/en/index.html#queryqueryover. 또한 이것을 확인하십시오 * 19.1.5. 일괄 가져 오기 사용 * http://nhforge.org/doc/nh/en/index.html#performance-fetching-batch –

+0

쿼리를 사용하고 방법을 모르는 경우 여기에서 도움을 받으십시오. 계속 전진 해 ... 일반적인 튜토리얼은 여기에서 다루지 않을 가능성이 높습니다. 내가 무슨 뜻인지 알 것 같아. http://stackoverflow.com/a/20970816/1679310 또는 http://stackoverflow.com/a/19287008/1679310 및이 Q & A를 확인하여 http://stackoverflow.com/questions를 통한 쿼리의 성능을 확인할 수 있습니다./20528760 / –