1

私は Nhibernate を初めて使用し、Nhibernate を使用してジェネリック リスト プロパティを持つクラス (Invoice) をマップしようとしていますが、エラーが発生し続けます: 「テーブル InvoiceDetails からの関連付けは、マップされていないクラスを参照しています: System.Int32」。各請求書にはより多くの詳細があるため、Invoices と InvoiceDetails テーブルの間の 1 対多の関係を考えました。

詳細: 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>
4

1 に答える 1

0

かなり良さそうです!

InvoiceID を修正

プロパティを修正する必要がありInvoiceDetail.InvoiceIDます。多対 1 のプロパティでは、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" />

修正バッグ

また、バッグは多対 1 にすることはできません。1 対多にする必要があります。ドキュメントを参照してください。これを交換して...

<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を参照してください。

于 2013-03-26T20:54:33.343 に答える