NHibernate:集合映射为级联所有删除孤立项的异常

NHibernate:集合映射为级联所有删除孤立项的异常,nhibernate,Nhibernate,我间歇性地收到以下异常: 拥有实体实例:Domain.Foo.bar不再引用cascade=“all delete orphan”的集合 Google上针对此异常的大多数结果表明,当您取消引用集合,而不是在现有集合上调用Clear()然后添加新实体时,会出现问题但是,这不是我的问题。 以下是所有相关代码: public class Foo { public int Id { get; set; } private Iesi.Collections.Generic.ISet&

我间歇性地收到以下异常:

拥有实体实例:Domain.Foo.bar不再引用cascade=“all delete orphan”的集合

Google上针对此异常的大多数结果表明,当您取消引用集合,而不是在现有集合上调用Clear()然后添加新实体时,会出现问题但是,这不是我的问题。

以下是所有相关代码:

public class Foo
{
     public int Id { get; set; }

     private Iesi.Collections.Generic.ISet<Bar> _bars = new HashedSet<Bar>();
     public virtual ICollection<Bar> Bars       
     {
         get { return _bars; }
     }
}

public class Bar
{
     public int Id { get; set; }
     public DateTime Expiry { get; set; }
}

public class FooDbMap : ClassMap<Foo>
{
    public FooDbMap
    {
        Id(x => x.Id);

        HasMany(x => x.Bars)
            .Access.CamelCaseField(Prefix.Underscore)
            .KeyColumn("FooId")
            .LazyLoad()
            .Where("Expiry > (select getdate())")
            .AsSet()
            .Cascade.AllDeleteOrphan();
    }
}
公共类Foo
{
公共int Id{get;set;}
private Iesi.Collections.Generic.ISet_bars=new HashedSet();
公共虚拟ICollection条
{
获取{返回_条;}
}
}
公共类酒吧
{
公共int Id{get;set;}
公共日期时间到期{get;set;}
}
公共类foodmap:ClassMap
{
公共食物地图
{
Id(x=>x.Id);
有许多(x=>x.bar)
.Access.CamelCaseField(前缀.下划线)
.KeyColumn(“FooId”)
.LazyLoad()
。其中(“到期日>(选择getdate())”)
1.资产()
.Cascade.AllDeleteOrphan();
}
}
通过此代码,您将看到不可能取消对Bars集合的引用,即通过执行以下操作:

foo.Bars = new List<Boo>();
foo.bar=新列表();

什么可能导致错误?

您永远不应该弄乱NHibernate创建的集合引用。首先,NH为延迟加载创建代理对象-用列表替换该代理,NH无法延迟加载内容或检测是否删除了任何子对象。其次,NH监视映射集合的更改(新实体、删除等)。仅仅用NH不知道的新收藏替换一个收藏不是一个好主意。NH仍将引用托管集合,特别是如果您让NH监视此集合并将所有更改级联到包含的子级


我只需清除集合以删除所有实体,而不是替换整个集合。

您永远不应该弄乱NHibernate创建的集合引用。首先,NH为延迟加载创建代理对象-用列表替换该代理,NH无法延迟加载内容或检测是否删除了任何子对象。其次,NH监视映射集合的更改(新实体、删除等)。仅仅用NH不知道的新收藏替换一个收藏不是一个好主意。NH仍将引用托管集合,特别是如果您让NH监视此集合并将所有更改级联到包含的子级


我只需清除集合以删除所有实体,而不是替换整个集合。

我知道-我在问题中解释了这一点,不是吗?是的,我向您解释了用新集合替换集合时出现错误的原因。那不是问题吗?不,那不是问题。在问题中,我说取消对集合的引用不是我的问题。事实上,我的代码基本上不可能取消对集合的引用,因为集合属性没有setter。问题是我怎么还能得到这个例外。啊,对不起,我误解了你的问题。我创建了一个示例项目,它按预期工作,但正如您所写的,错误并不总是发生在同一点上。很抱歉,我目前还不知道。我知道-我在问题中解释过,不是吗?是的,我向你解释了为什么你用新的集合替换集合时会出现错误。那不是问题吗?不,那不是问题。在问题中,我说取消对集合的引用不是我的问题。事实上,我的代码基本上不可能取消对集合的引用,因为集合属性没有setter。问题是我怎么还能得到这个例外。啊,对不起,我误解了你的问题。我创建了一个示例项目,它按预期工作,但正如您所写的,错误并不总是发生在同一点上。对不起,我现在不知道。