2009-08-20 2 views
0

편집 : 문제를 단순화하여 정말 귀찮게하는 것만 남겨 두었습니다. 복잡한 NHibernate 구성 요소 매핑

안녕 모두

,

나는 다음과 같은 매핑을 만들려고 노력하고 있습니다.

  • ColumnNumber
  • StringValue
  • LongValue로
  • DATEVALUE
    • ROWNUMBER : 내 데이터베이스에서

      는, 나는 테이블은 "ReportRowValue"containg 다음과 같은 열이 불렀다

    내 코드에서 두 개의 클래스를이 테이블에서 만들어보다 유용한 구조를 만들고 싶습니다. 이 작업은 구성 요소와 상속 을 사용하여 수행해야하지만 작업 매핑 파일을 만들지 못했습니다. 다음과 같은 코드에서 내가 원하는 보일 것이다 :

    ReportRow

    • ROWNUMBER
    • 값 (아래 ReportValue의 컬렉션) (추상 클래스 인)

    ReportValue

    • ColumnNumber
    • ,515,

    ReportValueString/ReportValueLong/ReportValueDate (ReportValue 상속 각)

    • 값 (각각이 하나 개의 타입의 값을 갖는)

    그리고 그건 모든 것에 대하여!

    누구든지 저에게 nhibernate 매핑 파일/파일을 만드는 방법을 가르쳐 줄 수 있습니까?

    지도와 그들 중 하나가

    mygeneration 당신이 찾을이 페이지에서 소프트웨어 http://sourceforge.net/projects/mygeneration/

    입니다 당신을위한 클래스를 빌드 도구의 몇 가지가있다

    감사합니다,

    Meigetsu

  • 답변

    0

    소프트웨어와 함께 실행해야하는 템플릿은 http://www.mygenerationsoftware.com/TemplateLibrary/Archives/?당신이 mygeneration 도구에서이 설정 한 후 쿼리 = NHibernate에

    당신은 당신 DB에 연결하고

    +0

    . 그가 발전기를 적용하면 원하는 클래스 구조가 생성되지 않습니다. – sirrocco

    +0

    "누구나 nhibernate 매핑 파일/파일을 만드는 방법을 가르쳐 줄 수 있습니까? 지금 nhibernate를 처음 사용하고 완전히 잃었습니다 ..." 이 도구는 절대적으로 도움이 될 수 있지만, 매핑 및 코드 생성 후 클래스. – avnic

    +0

    정밀도를 추가하겠습니다.이 특정 매핑 때문에 손실됩니다. 더 고전적인 매핑은 나를 위해 문제가되지 않습니다. (손으로 직접 수정하는 것이 더 좋으므로 배우겠습니다!). 어쨌든, sirrocco가 말했듯이, 당신의 솔루션은 고전적인/간단한 매핑을 생성 할 것이고, 여러 클래스로 테이블을 분리하는 방법에 대한 단서를주지 않을 것입니다. 어쨌든 도구를 사용해 주셔서 감사합니다. 나중에 유용 할 수 있습니다! –

    0

    불행하게도 당신이, 당신이 구성 요소의 다형성 구조를 가질 수 없습니다 것은 생성됩니다. 그러나 나는 너가 그것을 필요로하는지 acutally 확실하지 않다.

    다음 코드는 머리에 쓰이는 코드이므로 오류나 누락 된 항목이 있으므로 컴파일되지 않습니다. 그러나 방향을 표시해야합니다 :

    public class ReportRow 
    { 
        public int Id { get; private set; } 
        public IList<IReportValue> Values { get; private set; } 
    } 
    
    public interface IReportValue 
    { 
        public int Id{ get; set; } 
        public object UntypedValue { get; } 
    } 
    
    public abstract class ReportValue<T> : IReportValue 
    { 
        public int Id{ get; set; } 
        public T Value { get; set; } 
        public object UntypedValue { get { return Value; } } 
    } 
    
    public class ReportLongValue : ReportValue<long> {} 
    public class ReportStringValue : ReportValue<string> {} 
    public class ReportDateValue : ReportValue<DateTime>{} 
    

    매핑 :

    전혀 방법으로 자신의 문제를하는 데 도움이
    <class ReportRow> 
        <id ...> 
        <bag name="Values" > 
        <key column="RowNumber"/> 
        <one-to-many class="IReportValue"/> 
        </bag> 
    </class> 
    
    <class name="IReportValue" abstract="true"> 
        <id ...> 
        <subclass name="ReportLongValue"> 
        <property name="Value" column="LongValue"/> 
        </subclass> 
        <subclass name="ReportStringValue"> 
        <property name="Value" column="StringValue"/> 
        </subclass> 
        <subclass name="ReportDateValue"> 
        <property name="Value" column="DateValue"/> 
        </subclass> 
    </class> 
    
    +0

    내가 틀렸다면 저를 고쳐주십시오.하지만 그 해결책은 데이터베이스에 두 개의 다른 테이블 (ReportRow와 IReportValue)을 생성하게합니다. 그 excactly 내가 피하고 싶습니다 (단 rownumber와 ReportRow 테이블을 갖는 것은 나에게 불필요한 것 같습니다). –

    +0

    맞습니다. 두 개의 테이블이 있습니다. 로드 및 저장을 위해 사용자 지정 SQL을 사용하는 것을 피할 수 있습니다. 그러나 이것은 매우 간단하지 않습니다. 이 ReportRow는 실제로 어디에서 사용됩니까? 당신은 아마 이것을 들고있는 테이블과 병합 할 수 있습니다. –

    +0

    보고서 테이블에 사용됩니다. 나는 보고서를 병합하는 것이 좋은 생각이 아니며 행이라고 생각합니다. ;-) nhibernate가 그러한 구조를 허용하지 않는다는 결론에 도달 했으므로 방금 포기하고 비슷한 두 테이블 솔루션을 만들었습니다. –