NHibernate:Column不允许空值。 INSERT失败

时间:2009-02-26 12:49:11

标签: .net nhibernate fluent-nhibernate

我有2个实体Person和Address,Person有一个地址。

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

当我这样做时:

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

我得到了这个例外:

  

无法将值NULL插入   列'Key',表'Address';柱   不允许空值。 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>

我不明白为什么会发生这种情况,我给地址键一个值。我的方法有缺陷吗?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您应该在保存此人之前保存地址。根据生成器的不同,您可能必须使用传入ID的保存重载。

如果您需要隐藏保存,则应在此人中设置地址属性的级联。

答案 2 :(得分:0)

修正了它!

我更改了fluent nhibernate映射,我使用了References Relationship而不是HasOne。

这导致将映射更改为:

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