4

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

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

当我这样做时:

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

我得到这个例外:

无法将值 NULL 插入到列“键”、表“地址”中;列不允许空值。INSERT 失败。语句已终止。

从 Person 映射文件片段

<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>

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

4

3 回答 3

2

你需要这样做

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

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

或者如果您不想显式保存 Address ,请修改您的映射:

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

如果地址已经存在,则需要从数据库中获取:

PersonDTO person = new PersonDTO();
person.Age = "Bob";
person.Address = GetAddressDTO( 123 );
Save(person);
于 2009-02-26T13:05:11.710 回答
0

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

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

于 2009-02-26T12:58:10.073 回答
0

修复!

我更改了流利的 nhibernate 映射,我使用了引用关系而不是 HasOne。

这导致将映射更改为:

<many-to-one name="Address" column="AddressKey" />
于 2009-02-26T15:39:42.930 回答