NHibernate不从连接表中删除记录,将其更新为null

时间:2012-09-06 15:32:05

标签: nhibernate join mapping

我的映射(编辑和愚蠢以保护不那么无辜的人):

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
           assembly="MyAssembly, Culture=neutral"
           namespace="MyAssembly" auto-import="false">
  <class name="Customer" table="Customers">
    <id name="Id" access="nosetter.camelcase-underscore" >
      <generator class="assigned"/>
    </id>
    <property name="blah"/>
    ...
    <property name="bleh"/>
    <join table="Addresses" optional="true">
      <key column="Id"/>
      <component name="Address" class="MyAssembly.Address, MyAssembly, Culture=neutral" access="field.camelcase-underscore">
        <property name="Street" />
        <property name="Number" />
      </component>
    </join>
  </class>
</hibernate-mapping>

当我这样做时:

Address dir = new Address();
dir.Street = "Foo";
dir.Number = 27;
//// Previously loaded customer
cli.Address = dir;
//// Save repository, commit transaction

工作正常,并自动将新地址插入地址表。 但是,如果我想删除地址:

//// Previously loaded customer with attached address
cli.Address = null;
//// Save repository, commit transaction  

这不是从地址表中删除行,而是NHibernate更新它,将其所有字段设置为null,除了Id。

我的地图有什么问题?

1 个答案:

答案 0 :(得分:1)

鉴于您的映射,NHibernate正确执行。 join-clause用于将单个对象分布在多个表上。通常,对象的每个表中总会有一行。

另一方面,组件映射是指您需要细粒度对象模型,但是将数据存储在与拥有类相同的表中。如果属性为null,则除了将组件使用的所有列设置为null之外,NHibernate不能执行任何操作。组件列是连接表中唯一的非键列这一事实无关紧要。

也许你正在寻找一对一的映射? http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-onetoone