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中的关联指的是未映射的类
为了让它运行,我做了一些改进
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
更多阅读:
| 归档时间: |
|
| 查看次数: |
10072 次 |
| 最近记录: |