2012-10-25 5 views
0

CreditMemo, CreditMemoDetail, SalesInvoice, ReceivablesRecord, TransactionType과 같은 5 개의 도메인 객체가있는 brown-field 응용 프로그램이 있습니다. CreditMemo는 CreditMemoDetail을 사용하는 하나입니다. SalesInvoice와는 다 대일입니다. SalesInvoice는 TransactionType (아래 XML 매핑)과 함께 하나씩 많은 ReceivablesRecord를 가진 일대 다입니다. 어떤 관계도 직계 부모 이외의 다른 값에 의존하지 않습니다.예기치 않은 NHibernate Get 동작

Get (id)을 수행하면 전체 구조가 올바르게 반환됩니다. CreditMemo의 열이 제대로 채워지고 ISet이 정확하며 전체 SalesInvoice/ReceivablesRecord/TransactionType 계층 구조가 완전히 채워집니다. Get (invoiceNumber)을 수행하면 SalesInvoice 개체가 올바르게 채워지지만 ISet은 비어 있습니다. NHProfiler를 사용하면 매개 변수를 포함하여 정확히 같은 쿼리가 실행됩니다. 나는 지금 이것을 몇 시간 동안 두드리고 있었고, 의미있는 것을 생각해 낼 수 없었다.

나는 무언가 짐작할 수 있지만, CreditMemo로 시작할 때 관계가 자동으로 작동하지만 SalesInvoice로 시작하면 나에게 힘이되는 것은 아니라는 것을 알고 있습니다. 어떤 아이디어?

개체 및 매핑 :

public class CreditMemo 
{ 
    public virtual int CreditMemoId { get; set; } 
    public virtual string CreditMemoNumber { get; set; } 
    public virtual DateTime CreditDate { get; set; } 
    public virtual string InvoiceNumber { get; set; } 
    public virtual string ReturnToStock { get; set; } 
    public virtual string Posted { get; set; } 
    public virtual string Notes { get; set; } 
    public virtual Iesi.Collections.Generic.ISet<CreditMemoDetail> Details { get; set; } 
    public virtual SalesInvoice InvoiceInfo { get; set; } 
} 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" schema="aladdin" namespace="Receivables.Models"> 
    <class name="Receivables.Models.CreditMemo, Receivables" lazy="false" table="credit_memo"> 
    <id name="CreditMemoId" column="credit_memo_id"> 
     <generator class="identity" /> 
    </id> 
    <property name="InvoiceNumber" column="invoice_no" /> 
    <property name="CreditMemoNumber" column="credit_memo_no" /> 
    <property name="CreditDate" column="credit_date" type="DateTime" /> 
    <property name="ReturnToStock" column="return_to_stock" /> 
    <property name="Posted" column="posted" /> 
    <property name="Notes" column="notes" /> 
    <many-to-one name="InvoiceInfo" class="SalesInvoice" column="invoice_no" update="false" insert="false" /> 
    <set name="Details" cascade="delete"> 
     <key column="credit_memo_id" /> 
     <one-to-many class="CreditMemoDetail"/> 
    </set> 
    </class> 
</hibernate-mapping> 

public class CreditMemoDetail 
{ 
    public virtual int CreditMemoDetailId { get; set; } 
    public virtual int CreditMemoId { get; set; } 
    public virtual string CreditType { get; set; } 
    public virtual decimal Amount { get; set; } 
    public virtual string AffectCommission { get; set; } 
} 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" schema="aladdin" namespace="Receivables.Models"> 
    <class name="Receivables.Models.CreditMemoDetail, Receivables" lazy="false" table="cr_memo_detail"> 
    <id name="CreditMemoDetailId" column="crmemodetailid"> 
     <generator class="identity" /> 
    </id> 
    <property name="CreditMemoId" column="credit_memo_id" /> 
    <property name="CreditType" column="credit_type" /> 
    <property name="Amount" column="amount" /> 
    <property name="AffectCommission" column="affect_commission" /> 
    </class> 
</hibernate-mapping> 

public class SalesInvoice 
{ 
    public virtual string InvoiceNumber { get; set; } 
    public virtual string Customer { get; set; } 
    public virtual DateTime InvoiceDate { get; set; } 
    public virtual string SalesPerson { get; set; } 
    public virtual string ClassOfSale { get; set; } 
    public virtual Iesi.Collections.Generic.ISet<ReceivablesRecord> Transactions { get; set; } 
} 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" schema="aladdin" namespace="Receivables.Models"> 
    <class name="Receivables.Models.SalesInvoice, Receivables" lazy="false" table="invoice"> 
    <id name="InvoiceNumber" column="invoice_no"> 
     <generator class="assigned" /> 
    </id> 
    <property name="Customer" column="customer" /> 
    <property name="InvoiceDate" column="invoice_date" type="DateTime" /> 
    <property name="SalesPerson" column="salesman" /> 
    <property name="ClassOfSale" column="class" /> 
    <set name="Transactions"> 
     <key column="invoice_no" /> 
     <one-to-many class="ReceivablesRecord"/> 
    </set> 
    </class> 
</hibernate-mapping> 

public class ReceivablesRecord 
{ 
    public virtual string InvoiceNumber { get; set; } 
    public virtual DateTime AccrecDate { get; set; } 
    public virtual string TxType { get; set; } 
    public virtual decimal Amount { get; set; } 
    public virtual string Note { get; set; } 
    public virtual TransactionType TypeInfo { get; set; } 
    public override bool Equals(object obj) 
    { 
     bool result = false; 
     try 
     { 
      ReceivablesRecord input = (ReceivablesRecord)obj; 
      if (InvoiceNumber == input.InvoiceNumber && AccrecDate == input.AccrecDate && TxType == input.TxType) 
      { 
       result = true; 
      } 
     } 
     catch (Exception ex) 
     { 
     } 

     return result; 
    } 

    public override int GetHashCode() 
    { 
     return string.Format("{0}{1}{2}", InvoiceNumber, AccrecDate, TxType).GetHashCode(); 
    } 
} 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" schema="aladdin" namespace="Receivables.Models"> 
    <class name="Receivables.Models.ReceivablesRecord, Receivables" lazy="false" table="accrec"> 
    <composite-id> 
     <key-property name="InvoiceNumber" column="invoice_no" /> 
     <key-property name="AccrecDate" column="accrec_date" type="DateTime" /> 
     <key-property name="TxType" column="tx_type" /> 
    </composite-id> 
    <property name="Amount" column="amount" /> 
    <property name="Note" column="note" /> 
    <many-to-one name="TypeInfo" class="TransactionType" column="tx_type" /> 
    </class> 
</hibernate-mapping> 

public class TransactionType 
{ 
    public virtual string TransactionCode { get; set; } 
    public virtual string Description { get; set; } 
    public virtual decimal GLAccountNumber { get; set; } 
    public virtual string Taxable { get; set; } 
} 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" schema="aladdin" namespace="Receivables.Models"> 
    <class name="Receivables.Models.TransactionType, Receivables" lazy="false" table="txtype"> 
    <id name="TransactionCode" column="tx_code"> 
     <generator class="assigned" /> 
    </id> 
    <property name="Description" column="description" /> 
    <property name="GLAccountNumber" column="gl_account_no" type="Decimal" /> 
    <property name="Taxable" column="taxable" /> 
    </class> 
</hibernate-mapping> 

저장소 코드 :

public CreditMemo GetById(int id) 
    { 
     return NhSession.Get<CreditMemo>(id); 
    } 

    public SalesInvoice GetInvoiceByInvoiceNumber(string id) 
    { 
     SalesInvoice salesInvoice = NhSession.Get<SalesInvoice>(id); 
     return salesInvoice; 
    } 
일을 (즉,이 매핑을 변경하지 않고 SalesInvoice 아래 세부의 모든 레벨을 반환)하지

대체 GetInvoiceByInvoiceNumber :

return NhSession.CreateQuery("from SalesInvoice where InvoiceNumber = :invoice_no") 
     .SetString("invoice_no", id).UniqueResult<SalesInvoice>(); 
+0

"Get (id)를 수행 할 때"- 어떤 유형, 어떤 ID입니까? –

+0

"Get (invoiceNumber)"를 수행 할 때 - 여기서 (invoiceNumber)를 가져 오는 것입니까? –

+0

"올바르게 ISet이 비어 있습니다"- 어떤 설정? –

답변

0

ReceivablesRecord의 Equals 메서드가 문제가 될 수 있습니다.

public override bool Equals(object obj) 
{ 
    ReceivablesRecord other = obj as ReceivablesRecord; 
    return other != null && 
      InvoiceNumber == input.InvoiceNumber && 
      AccrecDate == input.AccrecDate && 
      TxType == input.TxType; 
} 
+0

같은 결과입니다. FWIW 저는 Equals 메서드가 기능적으로 동일하지만 귀하의 것이 더 간결하고 우아하다고 확신합니다. –