2009-02-26 39 views
4

我有2个实体人员和地址,人员有一个地址。NHibernate:列不允许有空值。 INSERT失败

编辑:地址已经存在,我只是想保存外键。

当我这样做:

PersonDTO person = new PersonDTO(); 
    person.Age = "Bob"; 
    person.Address = new AddressDTO {Key = 123}; 
    Save(person); 

我得到这个异常:

无法插入NULL值插入 列 '重点',表 '地址';列 不允许有空值。 INSERT失败。 语句已被终止。从人

<class name="PersonDTO" table="Person" xmlns="urn:nhibernate-mapping-2.2"> 
    <id name="Key" column="PersonKey" type="Guid"> 
     <generator class="guid" /> 
    </id> 
    <one-to-one name="Address" class="AddressDTOl" /> 
    </class> 

映射文件片段,我不明白为什么会这样,即时给予解决关键的值。我的方法有缺陷吗?

+0

包括NHibernate的映射和类声明。 – 2009-02-26 12:58:47

回答

0

修好了!

我改变了我的fluent nhibernate映射,我使用了引用关系而不是HasOne。

这导致更改映射到这一点:

<many-to-one name="Address" column="AddressKey" /> 
0

您应该在保存该人之前保存该地址。取决于生成器,您可能必须使用ID中传递的保存超载。

如果你需要隐含的保存,你应该设置地址属性级联的人。

+0

对不起,我没有清楚地址已经存在,我只是想保存人的链接到一个地址。 – Dan 2009-02-26 13:08:57

+0

您是否收到与您用于保存的会话相同的地址?如果不是,则需要将地址加入保存会话。 – 2009-02-26 13:12:36

2

你需要这样做

AddressDTO add = new AddressDTO {Key = 123}; 
Save(add); 

PersonDTO person = new PersonDTO(); 
person.Age = "Bob"; 
person.Address = add; 
Save(person); 

或修改您的映射,如果你不想显式地保存地址:如果地址已经存在

<many-to-one name="Address" column="..." class="AddressDTO" cascade="save-update" /> 

,你需要得到它数据库:

PersonDTO person = new PersonDTO(); 
person.Age = "Bob"; 
person.Address = GetAddressDTO(123); 
Save(person); 
相关问题