簡體   English   中英

Nhibernate映射具有泛型列表屬性的類

[英]Nhibernate mapping a class which has a generic list property

我是Nhibernate的新手,我正在嘗試使用Nhibernate映射具有通用列表屬性的類(發票),但我不斷收到錯誤消息:“表InvoiceDetails中的關聯引用了未映射的類:System.Int32”。 因為每個發票都有更多詳細信息,所以我在發票和InvoiceDetails表之間具有一對多的聯系。

詳細信息:a)發票類別:

public class Invoice
{
    private IList<InvoiceDetail> _invoiceDetails = new List<InvoiceDetail>();

    public virtual int InvoiceID { get; set; }
    public virtual string SerialNumber { get; set; }
    public virtual string Number { get; set; }
    public virtual DateTime InvoiceDate { get; set; }
    public virtual decimal Amount { get; set; }
    public virtual IList<InvoiceDetail> InvoiceDetails
    {
        get { return _invoiceDetails; }
        set { _invoiceDetails = value; }
    }
    public virtual Customer customer { get; set; }
    public virtual Institution Institution { get; set; }
    public virtual Receipt receipt { get; set; }
    public virtual bool IsDeleted { get; set; }
}

b)InvoiceDetail類:

public class InvoiceDetail
{
    public virtual int InvoiceDetailID { get; set; }
    public virtual int InvoiceID { get; set; }
    public virtual string ServiceDescription { get; set; }
    public virtual string Unit { get; set; }
    public virtual int Quantity { get; set; }
    public virtual double Value { get; set; }
    public virtual bool IsDeleted { get; set; }
}

c)發票映射文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    assembly="MyProject" namespace="MyProject.Model">
    <class name="Invoice" table="Invoices">
        <id name="InvoiceID" column="InvoiceID" type="int">
            <generator class="native"></generator>
        </id>
        <property name="SerialNumber" column ="InvoiceSerialNumber"/>
        <property name="Number" column ="InvoiceNumber"/>
        <property name="InvoiceDate"/>
        <property name="Amount"/>
        <property name="IsDeleted" />
        <many-to-one name="Institution" column="InstitutionID" />
        <bag name="InvoiceDetails" access="nosetter.camelcase"
            inverse ="true" lazy ="false" cascade="all-delete-orphan">
            <key column="InvoiceID"/>
            <many-to-one class="MyProject.Model.InvoiceDetail, MyProject"/>
        </bag>
    </class>
</hibernate-mapping>

d)InvoiceDetail映射文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    assembly="MyProject" namespace="MyProject.Model">
    <class name="InvoiceDetail" table="InvoiceDetails">
        <id name="InvoiceDetailID" column="InvoiceDetailID" type="int">
            <generator class="native"></generator>
         </id>
         <many-to-one name="InvoiceID" column="InvoiceID" />
         <property name="ServiceDescription"/>
         <property name="Unit"/>
         <property name="Quantity"/>
         <property name="Value"/>
         <property name="IsDeleted" />    
     </class>
 </hibernate-mapping>

看起來還不錯!

修正InvoiceID

您需要修復InvoiceDetail.InvoiceID屬性。 對於多對一屬性,您應該將它們建模為對父實體的引用,而不是像包含ID的簡單值屬性一樣。 您使用Invoice.Institution正確了。

InvoiceDetail ,替換此...

public virtual int InvoiceID { get; set; }

... 有了這個:

public virtual Invoice Invoice { get; set; }

同樣,在您的映射中,替換此...

<many-to-one name="InvoiceID" column="InvoiceID" />

... 有了這個:

<many-to-one name="Invoice" column="InvoiceID" />

固定袋

另外,袋子不能是多對一的,應該是一對多的。 請參閱文檔 取代這個...

<bag name="InvoiceDetails" access="nosetter.camelcase" inverse ="true" lazy ="false" cascade="all-delete-orphan">
  <key column="InvoiceID"/>
  <many-to-one class="MyProject.Model.InvoiceDetail, MyProject"/>
</bag>

... 有了這個:

<bag name="InvoiceDetails" access="nosetter.camelcase" inverse ="true" lazy ="false" cascade="all-delete-orphan">
  <key column="InvoiceID"/>
  <one-to-many class="MyProject.Model.InvoiceDetail, MyProject"/>
</bag>

關於Lazy = False的警告

最后一點:請注意lazy =“ false”。 如果您打算提高性能,那就讓NHibernate急切地獲取那些相關記錄,這不是做到這一點的方法。 有關為什么會出現此問題的說明,請參見http://ayende.com/blog/4573/nhibernate-is-lazy-just-live-with-it 請參閱http://nhibernate.info/doc/nh/en/index.html#performance-fetching,以了解各種正確實現此方法的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM