NHibernate似乎并不喜欢返回一个ReadOnlyCollection,我已经实现了我在大约30个地方读过的内容,作为支持私有字段的只读集合的正确访问策略。
我的实体中有以下代码:
private readonly IList<TagAlias> _aliases = new List<TagAlias>();
public IEnumerable<TagAlias> Aliases
{
get
{
return new ReadOnlyCollection<TagAlias>(this._aliases);
}
}
以及以下映射以允许访问支持字段
public sealed class TagMap : ClassMap<Tag>
{
public TagMap()
{
Table("Tag");
Id(x => x.Id).Column("TagId").GeneratedBy.Identity();
Map(x => x.Value).Column("TagName");
HasMany(x => x.Aliases)
.AsSet()
.Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)
.KeyColumn("TagId")
.LazyLoad()
.Inverse()
.Cascade.AllDeleteOrphan();
}
}
为什么NHibernate在我做类似.Clear()之类的东西时,仍然坚持通过现成的集合获取支持列表,而不是像我在映射中告诉它那样访问它?我不愿意为了持久层而改变我的域模型,但NHibernate似乎并不想合作。
我得到的错误是“拥有cascade的集合=”all-delete-orphan“不再被拥有的实体实例引用”但是当我在属性getter中返回this._aliases
时它就消失了。 / p>
答案 0 :(得分:2)
我通常使用这样的集合并且没有问题:
private IList<OrderLine> orderLines;
public virtual IEnumerable<OrderLine> OrderLines
{
get { return orderLines.Select(x => x); }
}
HasMany(x => x.OrderLines)
.Access.CamelCaseField()
.KeyColumn("ORDER_ID")
.Inverse()
.Cascade.AllDeleteOrphan();
我不确定您是如何使用集合来获取此错误的,但我通常在类中添加和删除集合的方法。如果这对您没有帮助,您可能会发布导致该错误的示例。
以下是我几个月前发布的相关文章:
Exposing HasMany and ManyToMany relationships as IEnumerable