1

我是NHibernate的新手。当我在主表上点击查询时,我遇到了nhibernate问题. 这降低了我的查询的性能。我只想要主表记录,而不是从数据库中触发任何其他查询。

我只想要 TAPVendor 表记录

下面是我从数据库中触发查询的 C# 代码

var lstTAPVendor = session.Query< TAPVendor >()

我还附上了 Tapvendor 的 .hbm 文件

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping namespace="M3.Entities" assembly="M3.Entities" xmlns="urn:nhibernate-mapping-2.2">
  <class name="TAPVendor" table="tAPVendor" schema="dbo">
    <id name="FVendorID" type="Guid">
      <generator class="assigned" />
    </id>
    <version name="FTimestamp" generated="always" unsaved-value="null" type="BinaryBlob">
      <column name="FTimestamp" not-null="true" sql-type="timestamp"/>
    </version>
    <property name="FActive" type="Boolean" not-null="true" />

    <property name="FTermsType" type="Int32" precision="10" not-null="true" />
    <property name="FACHPayment" type="Boolean" not-null="true" />
    <property name="FCompanyName" type="String" length="50" not-null="true" />
    <property name="FAccrueUseTax" type="Boolean" not-null="true" />
    <property name="FSinglePaymentVendor" type="Boolean" not-null="true" />
    <property name="FACHEnabled" type="Boolean" not-null="true" />
    <property name="FCheckPerInvoice" type="Boolean" not-null="true" />
    <property name="FBankAccountType" type="Int32" precision="10" not-null="true" />
    <property name="FBankAccountName" type="String" length="50" />
    <property name="FBankAccountNumber" type="String" length="50" />
    <property name="FBankABANumber" type="String" length="50" />
    <property name="FLegalName" type="String" length="50" />
    <property name="FDateAdded" type="DateTime" />
    <property name="FAddedBy" type="String" length="50" />
    <property name="FDateModified" type="DateTime" />
    <property name="FModifiedBy" type="String" length="50" />
    <property name="FAccountNo" type="Double" precision="53" />
    <property name="FDescription" type="String" length="100" />
    <property name="FTerms" type="Int32" precision="10" />
    <property name="F1099Box" type="Int16" precision="5" />
    <property name="F1099Type" type="String" length="15" />
    <property name="FTaxID" type="String" length="10" />
    <property name="FSSN" type="String" length="11" />
    <property name="FVendorNo" type="String" length="10" />
    <property name="FAccountNo2" type="Double" precision="53" not-null="false" />
    <property name="FIsUseAccountNo2" type="Boolean" not-null="true" />
    <many-to-one name="TAddres" class="TAddres" column="fAddressID" />
    <many-to-one name="TSCCompany" class="TSCCompany" column="fCompanyID" />
    <many-to-one name="TContact" class="TContact" column="fContactID" />
    <many-to-one name="TSCEnterprise" class="TSCEnterprise" column="fEnterpriseID" />
    <many-to-one name="TSCProperty" class="TSCProperty" column="fPropertyID" />
    <set name="TAPInvoices" table="tAPInvoice" inverse="true">
      <key column="fVendorID" />
      <one-to-many class="TAPInvoice" />
    </set>
    <set name="TBAChecks" table="tBACheck" inverse="true">
      <key column="fVendorID" />
      <one-to-many class="TBACheck" />
    </set>
    <set name="TAPRecurringInvoices" table="tAPRecurringInvoice" inverse="true">
      <key column="fVendorID" />
      <one-to-many class="TAPRecurringInvoice" />
    </set>
    <set name="TGLPostMasters" table="tGLPostMaster" inverse="true">
      <key column="fVendorID" />
      <one-to-many class="TGLPostMaster" />
    </set>
  </class>
</hibernate-mapping>
4

1 回答 1

1

有一些解决方案,从简单到困难 - 1. 删除<set>映射,或创建另一个没有它们的实体。2. 设置所有<set lazy="true">...</set>获取将仅在访问这些属性时发生。3.创建一个DTO(数据传输对象)实体,一个lite版本,并使用to NHibernate.Projectionslibrary有选择地获取属性。4. 设置<set fetch="join">...</set>在一个连接查询中获取所有数据,这可能会重复您的记录,所以要小心。

通常,NH 分离查询不一定是坏事,大表上的 JOIN 会导致更大的性能损失。您的问题可能不是映射问题,可能是数据库或代码问题。

于 2013-11-13T07:14:17.403 回答