无法在实体之间创建一对一关系

时间:2015-06-08 13:33:08

标签: c# nhibernate orm nhibernate-mapping

更新1:添加了实体类代码的链接。

我有一个Vehicle实体(用于保存有关车辆的信息)和一个 UploadedDocument实体(代表任何上传的文档,在这种情况下(比方说)注册文件)存储在DB中的单独表格中(其他实体也可能需要存储上传的文档)。这些之间存在一对一的对应关系。

映射:

<class name="Vehicle" table="Vehicles" lazy="true">
  <id name="ID">
    <generator class="native" />
  </id>
  <property name="License" />
  <property name="ManufactureYear" />
  <property name="PurchaseYear" />
  <one-to-one name="Registration" class="UploadedDocument" />
</class>

<class name="UploadedDocument" table="UploadedDocuments" lazy="true">
  <id name="ID">
    <generator class="native" />
  </id>
  <property name="Name" />
  <property name="Data" length="2147483647"  />
  <many-to-one name="SupplierCustomer" class="SupplierCustomer" column="SupplierCustomerID" />
</class>

Vehicle and UploadedDocument classes的代码。这就是保存这些类的代码:

using (ISession sess = NHibernateHelper.OpenSession())
{
    sess.Save(uploadedDoc);
    vehicleToAdd.Registration = uploadedDoc;
    sess.Save(vehicleToAdd);
}

事情没有像我期望的那样工作:NHibernate没有添加ID字段 UploadedDocumentVehicles表格,因此没有 一对一的关系。

如果我只是将<one-to-one>映射更改为<many-to-one name="Registration" class="UploadedDocument" column="RegistrationID" />文件中的Vehicle.hbm.xml,我可以让事情发挥作用,但我不需要 双向映射或多对一映射。简单,简单的一对一映射 RegistrationID表格中显示Vehicles列的位置。是否 NHibernate没有提供简单的方法来创建一对一的关系 VehicleUploadedDocument

2 个答案:

答案 0 :(得分:0)

您需要在<one-to-one>标记中设置外键,否则,NHibernate会通过其ID连接这两个实体。 如果要通过cretain列将主实体(Vehicle)通过其ID连接到另一个实体,则需要添加foreign-key属性并声明连接列。

<one-to-one name="Registration" class="UploadedDocument" foreign-key="RegistrationID" />

答案 1 :(得分:0)

找到正确的方法:使用<many-to-one>映射添加unique约束:

<many-to-one name="Registration" class="UploadedDocument"
    column="RegistrationID" unique="true" />

供进一步参考:5.1.12. one-to-one