gpt4 book ai didi

c# - Nhibernate一对多添加元素

转载 作者:太空宇宙 更新时间:2023-11-03 13:14:55 26 4
gpt4 key购买 nike

我阅读了很多关于此的讨论,但找不到解决方案。 There我发现在 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 property references a null or transient value 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();
}

Later, when we will load data via NHibernate, we would expect that both ends are properly initiated. The same we should do at the moment of instances creation.

我。 inverse="假"

现在,如果您可以使表“ips”中的列“device_id”可为空...那将起作用。但是因为您已经显式声明了 inverse="false"(默认设置),NHibernate 必须而且总是会

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

那总是会发生的。如果 inverse="false"

二。 inverse="true"

因为我们已经提到过,无论如何都必须在 C# 中定义关系的两端 - 根本没有必要不使用 NHibernate 的强大功能....

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

  • 将发出 INSERT 以添加新的 Ip 记录,以及它与设备的正确关系(device_id 列)

那个映射实际上是为我们准备的。为了优化数据处理,基于我们确实在代码中正确设置关系的信任。

一般来说,我几乎不记得不使用反向映射的情况......

关于c# - Nhibernate一对多添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26820021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com