gpt4 book ai didi

NHibernate在ParentClass的ChildCollection中删除和添加

转载 作者:行者123 更新时间:2023-12-01 04:09:22 26 4
gpt4 key购买 nike

我有以下问题。

我有一个带有子对象集合的父类。

 public class Parent{

int _id;
IList<Child> _childs = new List<Child>();


public IList<Child> Childs {get;}
}

public class Child{

int _id;
string _name;
Parent _parent;

protected Child(){}

public Child(Parent parent, string name){
_parent = parent;
_name = name;
}
}

这些类使用 nhibernate 映射到数据库,其中列 tblChild.colName 具有唯一索引。
 // Parent
<bag name="_childs" access="field" cascade="all-delete-orphan" inverse="true">
<key column="ParentId" />
<one-to-many class="Parent" />
</bag>

// Child
<many-to-one name="_parent" column="ParentId" cascade="none" access="field">

我的问题:
由于唯一索引,以下代码抛出异常:
 Parent parent = new Parent();
Child child1 = new Child(parent, "Child1");
Child child2 = new Child(parent, "Child2");
Child child3 = new Child(parent, "Child3");

parent.Childs.Add(child1);
parent.Childs.Add(child2);
parent.Childs.Add(child3);

parentDao.Save(parent);
parentDao.FlushAndClear();

Child child4 = new Child(parent, "Child1"); // Duplicate Name
parent.Childs.Remove(child1);
parent.Childs.Add(child4);

parentDao.Save(parent);
parentDao.FlushAndClear();

出现异常的原因是NHibernate先插入child4,然后再移除child1。为什么 NHibernate 这样做?
有人解释一下,可以帮助我解决这个问题吗?

最佳答案

SQL语句的顺序是predefined在 NHibernate 中:

The SQL statements are issued in the following order

  • all entity insertions, in the same order the corresponding objects were saved using ISession.Save()

  • all entity updates

  • all collection deletions

  • all collection element deletions, updates and insertions

  • all collection insertions

  • all entity deletions, in the same order the corresponding objects were deleted using ISession.Delete()



NHibernate 认为 child 的新实例实际上是一个新实体。所以它首先插入它,违反了你的数据库约束。这意味着您有两个选择:

1) 取出后立即冲洗,添加 child 之前。

2)稍微更改您的设计,以便您只需编辑子项而不是删除/添加。这似乎更合乎逻辑,因为看起来 Child 是一个由 Name 标识的实体。目前尚不清楚您实际添加和删除同一个 child 的原因:
Child child = parent.GetChildByName("Child1");
child.DoSomething();

或者像这样:
parent.DoSomethingWithChild("Child1");

附言我假设您的 Child.Equals 实现使用 name 并且在您的映射中您有 <one-to-many class="Child" /> ,不是 <one-to-many class="Parent" /> .这可能只是一个错字。

关于NHibernate在ParentClass的ChildCollection中删除和添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7244925/

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