C# NHibernate:简单删除孤立方案不起作用
我正在尝试使用NHibernate建立一个简单的一对多关系/层次结构。我希望自动删除孤立项,但我当前的尝试都会导致ObjectDeletedException。我想知道是否有人能告诉我我做错了什么 编辑: 我应该指定我正在加载一个根Foo,然后在会话之外删除一个子项,从而导致一个或多个子项成为孤儿。当我随后在第二个会话中调用SaveOrUpdate(root)时,会发生异常。如何纠正分离和修改的对象与数据库中持久化的对象在子对象列表中的差异 所讨论的示例代码如下所示:C# NHibernate:简单删除孤立方案不起作用,c#,sql,nhibernate,fluent-nhibernate,cascade,C#,Sql,Nhibernate,Fluent Nhibernate,Cascade,我正在尝试使用NHibernate建立一个简单的一对多关系/层次结构。我希望自动删除孤立项,但我当前的尝试都会导致ObjectDeletedException。我想知道是否有人能告诉我我做错了什么 编辑: 我应该指定我正在加载一个根Foo,然后在会话之外删除一个子项,从而导致一个或多个子项成为孤儿。当我随后在第二个会话中调用SaveOrUpdate(root)时,会发生异常。如何纠正分离和修改的对象与数据库中持久化的对象在子对象列表中的差异 所讨论的示例代码如下所示: Foo foo = new
Foo foo = new Foo();
Foo child1 = new Foo();
Foo child2 = new Foo();
foo.Children.Add(child1);
child1.Children.Add(child2);
// session #1
session.SaveOrUpdate(foo);
// so far, so good
// outside of any session
foo.Children.Clear();
// session #2
PutFoo(foo); // results in ObjectDeletedException
public class Foo
{
private ISet<Bar> _bars = new HashSet<Bar>();
public ReadOnlyCollection<Bar> Bars { get return new List<Bar>(_bars).AsReadOnly(); }
public void AddBar( Bar b )
{
b.Parent = this;
_bars.Add (b);
}
public void RemoveBar( Bar b )
{
b.Foo = null;
_bars.Remove (b);
}
}
public class Bar
{
public Foo Parent { get; set; }
}
要持久化的对象:
class Foo
{
private IList<Foo> children = new List<Foo> children;
public virtual int Id { get; private set; }
public IList<Foo> Children
{
get { return children; }
set { children = value; }
}
}
我一直在做的就是创造一种双向关系 因此,这意味着孩子们有一个对他们父母的引用。 从集合中删除子对象时,我还将对父对象的引用设置为NULL 在映射中,还必须指示关系的“反向”端。 我也从不在课堂外公开收藏的“原样” 因此,我主要是这样做的:
Foo foo = new Foo();
Foo child1 = new Foo();
Foo child2 = new Foo();
foo.Children.Add(child1);
child1.Children.Add(child2);
// session #1
session.SaveOrUpdate(foo);
// so far, so good
// outside of any session
foo.Children.Clear();
// session #2
PutFoo(foo); // results in ObjectDeletedException
public class Foo
{
private ISet<Bar> _bars = new HashSet<Bar>();
public ReadOnlyCollection<Bar> Bars { get return new List<Bar>(_bars).AsReadOnly(); }
public void AddBar( Bar b )
{
b.Parent = this;
_bars.Add (b);
}
public void RemoveBar( Bar b )
{
b.Foo = null;
_bars.Remove (b);
}
}
public class Bar
{
public Foo Parent { get; set; }
}
公共类Foo
{
私有ISet_bar=新HashSet();
public ReadOnlyCollection bar{get return new List(_bar).AsReadOnly();}
公共无效添加栏(b栏)
{
b、 父=此;
_条.加入(b);
}
公共无效删除栏(b栏)
{
b、 Foo=null;
_移除(b)条;
}
}
公共类酒吧
{
公共Foo父对象{get;set;}
}
然后,在映射中,我在集合上设置了“反向”端。
因此,这意味着在我的映射(我仍然使用xml文件来指定映射)中,我在Foo类的Bars集合上设置了inverse=true属性。我通常做的是创建双向关系 因此,这意味着孩子们有一个对他们父母的引用。 从集合中删除子对象时,我还将对父对象的引用设置为NULL 在映射中,还必须指示关系的“反向”端。 我也从不在课堂外公开收藏的“原样” 因此,我主要是这样做的:
Foo foo = new Foo();
Foo child1 = new Foo();
Foo child2 = new Foo();
foo.Children.Add(child1);
child1.Children.Add(child2);
// session #1
session.SaveOrUpdate(foo);
// so far, so good
// outside of any session
foo.Children.Clear();
// session #2
PutFoo(foo); // results in ObjectDeletedException
public class Foo
{
private ISet<Bar> _bars = new HashSet<Bar>();
public ReadOnlyCollection<Bar> Bars { get return new List<Bar>(_bars).AsReadOnly(); }
public void AddBar( Bar b )
{
b.Parent = this;
_bars.Add (b);
}
public void RemoveBar( Bar b )
{
b.Foo = null;
_bars.Remove (b);
}
}
public class Bar
{
public Foo Parent { get; set; }
}
公共类Foo
{
私有ISet_bar=新HashSet();
public ReadOnlyCollection bar{get return new List(_bar).AsReadOnly();}
公共无效添加栏(b栏)
{
b、 父=此;
_条.加入(b);
}
公共无效删除栏(b栏)
{
b、 Foo=null;
_移除(b)条;
}
}
公共类酒吧
{
公共Foo父对象{get;set;}
}
然后,在映射中,我在集合上设置了“反向”端。
因此,这意味着在我的映射中(我仍然使用xml文件来指定映射),我在Foo类的Bars集合上设置了inverse=true属性。我添加了Parent和Add()/Remove()方法,但在删除子节点后在根节点上调用SaveOrUpdate()时仍然会出现异常。我应该提到,我加载根目录,然后在会话外部调用Remove()。只有在从第二个会话中删除子节点并调用SaveOrUpdate()时,才会发生异常。我添加了Parent和Add()/remove()方法,但在删除子节点后在根节点上调用SaveOrUpdate()时仍会出现异常。我应该提到,我加载根目录,然后在会话外部调用Remove()。只有在从第二个会话中删除子会话并调用SaveOrUpdate()时,才会发生异常。