我有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>
我不明白为什么会发生这种情况,我给地址键一个值。我的方法有缺陷吗?
答案 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" />