【问题标题】:NHibernate and ReadOnlyCollection<T>NHibernate 和 ReadOnlyCollection<T>
【发布时间】:2012-02-23 09:21:59
【问题描述】:

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

当我执行 .Clear() 之类的操作时,为什么 NHibernate 仍然坚持通过仅现成的集合获取支持列表,而不是像我在映射中告诉它的那样访问它?我不愿意仅仅为了持久层而改变我的领域模型,但 NHibernate 似乎并不想合作。

我得到的错误是“拥有 cascade="all-delete-orphan" 的集合不再被拥有的实体实例引用”但是当我在属性 getter 中返回 this._aliases 时它就消失了。

【问题讨论】:

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


    【解决方案1】:

    我一般用这样的集合,没有问题:

    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

    【讨论】:

    • 好东西。使用 .Select(x => x) 解决了我一直遇到的很多问题,并且仍然将其保留为只读。将您的标记为已接受的答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-01-19
    • 2012-01-26
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    相关资源
    最近更新 更多