gpt4 book ai didi

c# - NHibernate:更改父级 - "deleted object would be re-saved by cascade"

转载 作者:太空宇宙 更新时间:2023-11-03 15:45:59 25 4
gpt4 key购买 nike

正如标题所说,基本上我想做的是改变 child 的 parent 。但是当我尝试这样做时,我得到异常“ObjectDeletedException:删除的对象将被级联重新保存(从关联中删除已删除的对象)”。

我已经用谷歌搜索了几个小时,但我找到的解决方案都不适合我!

这些是我涉及的类(class):

public class Parent: Entity
{
public virtual IList<Child> Children { get; set; }
}

public class Child: Entity
{
public virtual DateTime? CancellationDate { get; set; }
}

Entity 类是具有 Id 属性的类。

这是 parent 的映射(Parents.hbm.xml):

<bag name="Children" cascade="all-delete-orphan" table="Schema.Child" where="CancellationDate is null">
<key column="ParentID"/>
<one-to-many class="Namespace.Child"/>
</bag>

这是我尝试将 child 重新分配给另一个 parent 的代码片段:

foreach(Child c in Parent1.Children)
{
Parent2.Children.Add(c);
}

但是,session.Flush() 会抛出上面的异常。我想问题是,由于 Child 改变了他的父级,因为级联 NHibernate 必须消除 Child,但随后它被重新分配给另一个父级,所以再次由于级联,它必须重新保存 child 。

我已经尝试过更改映射,并从前父项的集合中删除子项(在我将其分配给另一个父项之前或之后),但这些都不起作用...

任何帮助将不胜感激!!

谢谢!!

最佳答案

我已经看到您的免责声明:...我已经用谷歌搜索了几个小时,但我找到的解决方案都不适合我!!

但总的来说,上面的例子从不能够(重新)产生ObjectDeletedException

nhibernate 中甚至有一个内置测试,它会检查:

NHibernate.Test.NHSpecificTest.NH1531 SampleTest ReparentingShouldNotFail

[Test]
public void ReparentingShouldNotFail()
{
FillDb();
using ( ISession session = OpenSession() )
{
var parent1 = session.Get<Parent>(1);
var parent2 = session.Get<Parent>(2);

Assert.AreEqual(1, parent1.Children.Count);
Assert.AreEqual(0, parent2.Children.Count);

Child p1Child = parent1.Children[0];

Assert.IsNotNull(p1Child);

parent1.DetachAllChildren();
parent2.AttachNewChild(p1Child);

session.Update(parent1);
session.Update(parent2);

// NHibernate.ObjectDeletedException :
// deleted object would be re-saved by cascade
// (remove deleted object from associations)
// [NHibernate.Test.NHSpecificTest.NH1531.Child#0]

session.Flush();
}
...

这个测试通过了。

那么问题出在哪里呢?只是在您未显示的代码中的某个地方。可以在此处找到此类问题的详细描述:

还有一些讨论和更多提示

ObjectDeletedException ("deleted object would be re-saved...") 几乎总是意味着:某个对象已被删除。即存储在当前 session 中的信息。但是仍然有一些集合引用它......

关于c# - NHibernate:更改父级 - "deleted object would be re-saved by cascade",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28114508/

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