我间歇性地收到以下异常:
拥有实体实例不再引用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>();
可能导致错误的原因是什么?
答案 0 :(得分:0)
你永远不应该搞乱NHibernate创建的集合引用。首先,NH为延迟加载创建代理对象 - 用List&lt;&gt;替换该代理。并且NH无法延迟加载内容或检测是否有任何儿童被移除。其次,NH监视集合的变化(新实体,删除等)。只是用一个NH确实不知道的新系列替换一个系列并不是一个好主意。 NH仍将引用托管集合,特别是如果您有NH监控此集合并将所有更改级联到包含的子集。
我只是清除集合以删除所有实体,而不是替换整个集合。