Nhibernate一对多元素添加
本文关键字:添加 元素 一对多 Nhibernate | 更新日期: 2023-09-27 18:29:45
我读了很多关于这方面的讨论,但找不到解决方案。在那里,我发现在nhibernate版本3中,它必须工作。我使用nhibernate 3.3.3
类设备有许多Ips
public class Device
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Place { get; set; }
private Iesi.Collections.Generic.ISet<Ip> _ips = new HashedSet<Ip>();
public virtual Iesi.Collections.Generic.ISet<Ip> Ips
{
get
{
return _ips;
}
set
{
_ips = value;
}
}
}
public class Ip
{
public virtual int Id { get; set; }
public virtual Device Device { get; set; }
public virtual string Adress { get; set; }
}
映射
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="nhibbd" namespace="nhibbd.Domain">
<class name="Device" table="devices" lazy="true">
<id name="Id">
<generator class="identity" />
</id>
<property name="Name">
<column name="name" sql-type="character varying" not-null="true" length="30"/>
</property>
<property name="Place" >
<column name="place" sql-type="character varying" not-null="true" length="30"/>
</property>
<set name="Ips" inverse="false" cascade="all" generic="true">
<key column="device_id" not-null="true" update="false"/>
<one-to-many class="nhibbd.Domain.Ip" />
</set>
</class>
</hibernate-mapping>
<hibernate-mapping assembly="nhibbd" namespace="nhibbd.Domain" xmlns="urn:nhibernate-mapping-2.2">
<class name="Ip" table="ips" lazy="true" >
<id name="Id">
<generator class="identity" />
</id>
<many-to-one name="Device" class="Device">
<column name="device_id" not-null="true" sql-type="INTEGER" />
</many-to-one>
<property name="Adress">
<column name="adress" sql-type="character varying" not-null="true" length="12"/>
</property>
</class>
</hibernate-mapping>
只是想添加设备
var device = new Device {Name = "D-Link DIR 320", Place = "320 room"};
var ip = new Ip {Adress = "1921680000001"};
using (var session = GetSession)
using (var transaction = session.BeginTransaction())
{
device.Ips.Add(ip);
session.Save(device);
transaction.Commit();
}
并获得异常
NHibernate.PropertyValueException:not null属性引用null或瞬态值nhibbd。Domain.Ip.Device
我想使用inverse="false"进行采集,而not null="true"Ip.Device值。我该怎么做?
要解决您的问题,我们首先必须正确设置域模型。这意味着,关系的双方都必须被分配:
using (var transaction = session.BeginTransaction())
{
device.Ips.Add(ip);
// new line
ip.Device == device;
session.Save(device);
transaction.Commit();
}
稍后,当我们将通过NHibernate加载数据时,我们希望两端都能正确启动。我们在创建实例时也应该这样做。
I。inverse="false"
现在,如果您可以使表"ips"中的列"device_id"为null。。。这会奏效的。但是,因为您已经明确声明inverse="false"(默认设置),NHibernate必须并且始终将
- 将记录插入ips表,NULL表示与父列(device_id)的关系
- 更新引用id为其父项的记录(device_id将使用正确的设备引用进行更新)
这将永远发生。如果逆="false"
IIinverse="true"
因为我们已经提到,无论如何,关系的两端都必须在C#中定义——根本没有必要不使用NHibernate的力量。。。。
只需使用映射到inverse="true"
和:
- 将发出INSERT以添加新的Ip记录,并将其与设备(Device_id列)建立适当关系
事实上,这种映射对我们来说是存在的。为了优化数据处理,基于我们在代码中正确设置关系的信任。
一般来说,我几乎不记得双向映射上的逆不被使用的情况。。。