NHibernate:异常,集合映射为cascade all-delete-orphan

时间:2011-05-25 05:02:52

标签: nhibernate

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

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

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();
    }
}

您将看到使用此代码,无法取消引用 Bars 集合,即通过执行以下操作:

foo.Bars = new List<Boo>();

可能导致错误的原因是什么?

1 个答案:

答案 0 :(得分:0)

你永远不应该搞乱NHibernate创建的集合引用。首先,NH为延迟加载创建代理对象 - 用List&lt;&gt;替换该代理。并且NH无法延迟加载内容或检测是否有任何儿童被移除。其次,NH监视集合的变化(新实体,删除等)。只是用一个NH确实不知道的新系列替换一个系列并不是一个好主意。 NH仍将引用托管集合,特别是如果您有NH监控此集合并将所有更改级联到包含的子集。

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