gpt4 book ai didi

fluent-nhibernate - NHibernate 坚持将对象添加到集合的顺序

转载 作者:行者123 更新时间:2023-12-04 07:42:50 24 4
gpt4 key购买 nike

我可能在这里犯了一个新手错误,但我不知道如何让它工作。我有两个实体 - ParentChild ,其中一个 Parent可以有很多Child仁。问题似乎是,当我向父级添加一个新的子级时,父级无法级联保存子级,因为子级实例还没有 ID。另一方面,子进程不能自己持久化,所以它没有办法得到一个ID...

我的映射:

public ParentMap()
{
// ID and other properties

HasMany(p => p.Children).Cascade.AllDeleteOrphan().Not.LazyLoad();
}

public ChildMap()
{
// ID and other properties

References(c => c.Parent);
}

现在,我的数据库中可能已经有一条父记录,我想将一个 child 添加到它的 child 集合中。为此,我创建了 Child 的一个新实例类,将 child 添加到 parent 的 Children属性(类型 IList<Child> )。我还获取父记录并设置子记录 Parent父实体的属性。

当我尝试保存它时,无论我尝试以何种顺序保存,都会出现错误。

Save(p) ,保存父记录并希望子记录保存在级联中,我收到以下错误:

Cannot insert the value NULL into column 'ChildID', table 'dbo.Children'; column does not allow null values. INSERT fails. The statement has been terminated.

如果我尝试相反的方法,即先保存子项,然后将其添加到父项并保存父项,我会收到以下错误:

null id in Application.Domain.Entities.Child entry (don't flush the Session after an exception occurs)

我应该按什么顺序调用parent.Children.Add(child) , child.Parent = parent , session.Save(parent) , 和 session.Save(child)使这项工作?我的映射配置中是否缺少某些内容?

更新:我添加了.Inverse() , 并尝试了以下但没有成功:

// First of the above errors
session.Save(child);
child.Parent = parent;
parent.Children.Add(child);
session.Save(parent);

// Second of the above errors
child.Parent = parent;
parent.Children.Add(child);
session.Save(child);
session.Save(parent);

// Second of the above errors
child.Parent = parent;
parent.Children.Add(child);
session.Save(parent);

// Second of the above errors
child.Parent = parent;
parent.Children.Add(child);
session.Save(child);

最佳答案

在 parent 一方将您的关系标记为Inverse。这会说 NHibernate 子端管理关系:

HasMany(p => p.Children).Cascade.AllDeleteOrphan().Not.LazyLoad().Inverse();

这会强制您手动设置 child.Parent = parent,但您还是要这样做,所以我相信这不是问题。

默认情况下,NHibernate 假定父项有责任为子项设置外键。操作的逻辑顺序看起来像这样:

  1. parent 要得救
  2. 子级因级联而得救 - 我们还没有 parent ID(至少我们不能有,我也不知道为什么当我们知道它时它会这样工作)
  3. 子项在父项的外键中插入 null
  4. 然后成功插入父级,获取其 ID
  5. child 更新了 parent 的外键。

在您的第一个场景中,它在第 3 处失败,因为您没有可为空的外键列并且 NHibernate 不够聪明,无法找到任何解决方案。

设置 Inverse() 告诉 Parent 不关心子外键,您有责任正确设置 child.Parent。在这种情况下保存时,如预期的那样只有 INSERT,并且没有尝试在外键中设置 null

关于fluent-nhibernate - NHibernate 坚持将对象添加到集合的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6817384/

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