NHibernate和ReadOnlyCollection <t> </t>

时间:2012-02-23 09:22:00

标签: c# .net nhibernate fluent-nhibernate fluent-nhibernate-mapping

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>

1 个答案:

答案 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