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值。我该怎么做?

Nhibernate一对多元素添加

要解决您的问题,我们首先必须正确设置域模型。这意味着,关系的双方都必须被分配:

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必须并且始终将

  1. 将记录插入ips表,NULL表示与父列(device_id)的关系
  2. 更新引用id为其父项的记录(device_id将使用正确的设备引用进行更新)

这将永远发生。如果逆="false"

IIinverse="true"

因为我们已经提到,无论如何,关系的两端都必须在C#中定义——根本没有必要不使用NHibernate的力量。。。。

只需使用映射到inverse="true"和:

  • 将发出INSERT以添加新的Ip记录,并将其与设备(Device_id列)建立适当关系

事实上,这种映射对我们来说是存在的。为了优化数据处理,基于我们在代码中正确设置关系的信任。

一般来说,我几乎不记得双向映射上的逆不被使用的情况。。。