NHibernate <one-to-many>

czu*_*awo 5 c# nhibernate orm hibernate nhibernate-mapping

我该如何映射这两个类?

public class LDAVehicle 
{
    public virtual int VehicleId { get; set; }
    public virtual string ChassisSeries { get; set; }
    public virtual string ChassisNumber { get; set; }

    public virtual List<LDAReading> Readings { get; set; }
}

public class LDAReading 
{
    public virtual int ReadingId { get; set; }
    public virtual DateTime IncomingDate { get; set; }
    public virtual DateTime ReadoutDate { get; set; }
    public virtual string Sender { get; set; }

    public virtual LDAVehicle Vehicle { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我确实有这个xml:

<class name="LDAVehicle" table="Vehicle" schema="dbo" lazy="false">
    <id name="VehicleId">
        <column name="VehicleId" />
        <generator class="native"></generator>
    </id>
    <property name="ChassisSeries" column="ChassisSeries" not-null="false" />
    <property name="ChassisNumber" column="ChassisNumber" not-null="false" />

    <set name="Readings" table="Reading" fetch="join">
        <key foreign-key="VehicleId" />
        <one-to-many class="LDAReading" />
    </set>
</class>

<class name="LDAReading" table="Reading" schema="dbo" lazy="false">
    <id name="ReadingId">
        <column name="ReadingId" />
        <generator class="native"></generator>
    </id>
    <property name="IncomingDate" column="IncomingDate" not-null="true" />
    <property name="ReadoutDate" column="ReadoutDate" not-null="true" />
    <property name="Sender" column="Sender" not-null="false" />
    <many-to-one name="Vehicle" class="LDAVehicle" fetch="select" column="VehicleId" />
</class>
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

表Reading中的关联指的是未映射的类

Rad*_*ler 4

为了让它运行,我做了一些改进

1)C#

如果我们映射集合,它们必须表示为接口,这样 NHibernate 将能够注入代理...自己的实现

public class LDAVehicle 
{
    public virtual int VehicleId { get; set; }
    public virtual string ChassisSeries { get; set; }
    public virtual string ChassisNumber { get; set; }

    //public virtual List<LDAReading> Readings { get; set; }
    public virtual IList<LDAReading> Readings { get; set; }
}

public class LDAReading 
{
    public virtual int ReadingId { get; set; }
    public virtual DateTime IncomingDate { get; set; }
    public virtual DateTime ReadoutDate { get; set; }
    public virtual string Sender { get; set; }

    public virtual LDAVehicle Vehicle { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

2)HBM

对于映射集合,我将使用 bag (直到 NHibernate 4 发布并原生使用系统内容,我们需要使用 iesi 集合......所以<bag>现在已经足够好了)

此外,如果属性名称和列相同,我们就不必提及列。

最后,现在所有映射都非常惰性。这就是要走的路

<class name="LDAVehicle" table="Vehicle" schema="dbo" lazy="true"> // should be lazy
    <id name="VehicleId" column="VehicleId" generator="native" />  // simple id def

    <property name="ChassisSeries" not-null="false" /> // name is enough
    <property name="ChassisNumber" not-null="false" /> // if column is the same

    // IList and <bag> go work together
    // also profit from lazy loading, 
    //  batch size fetching and inverse mapping
    <bag name="Readings" lazy="true" inverse="true" 
                         batch-size="25" cascade="all-delete-orphan"> 
        <key column="VehicleId" />
        <one-to-many class="LDAReading" />
    </bag>
</class>

<class name="LDAReading" table="Reading" schema="dbo" lazy="true">
    <id name="ReadingId" generator="native" />

    <property name="IncomingDate" not-null="true" />
    <property name="ReadoutDate"  not-null="true" />
    <property name="Sender"       not-null="false" />

    <many-to-one name="Vehicle" class="LDAVehicle" column="VehicleId" />
</class>
Run Code Online (Sandbox Code Playgroud)

3)确保两个映射都是Embedded Resources。如果找不到其中之一...未嵌入...抛出问题中的异常...此外,两个文件都应该/必须具有后缀.hbm.xml

更多阅读: