我的映射(编辑和愚蠢以保护不那么无辜的人):
<?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。
我的地图有什么问题?
答案 0 :(得分:1)
鉴于您的映射,NHibernate正确执行。 join-clause用于将单个对象分布在多个表上。通常,对象的每个表中总会有一行。
另一方面,组件映射是指您需要细粒度对象模型,但是将数据存储在与拥有类相同的表中。如果属性为null,则除了将组件使用的所有列设置为null之外,NHibernate不能执行任何操作。组件列是连接表中唯一的非键列这一事实无关紧要。
也许你正在寻找一对一的映射? http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-onetoone