【问题标题】:NHibernate: Exception with collection mapped as cascade all-delete-orphanNHibernate:集合映射为级联全删除孤儿的异常
【发布时间】:2011-05-26 09:45:40
【问题描述】:

我间歇性收到以下异常:

拥有的实体实例不再引用具有 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>();

什么可能导致错误?

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

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

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

    【讨论】:

    • 我知道 - 我在我的问题中解释过,不是吗?
    • 是的,我向您解释了为什么当您将收藏替换为新收藏时会出现该错误。不是这个问题吗?
    • 不,这不是问题所在。在问题中,我说取消引用集合不是我的问题。事实上,我的代码基本上不可能取消引用集合,因为集合属性没有设置器。问题是我怎么还能得到这个异常。
    • 对不起,我误读了你的问题。我创建了一个示例项目,它按预期工作,但正如您所写,错误并不总是在同一点发生。对不起,我目前不知道。
    猜你喜欢
    • 2013-06-05
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多